2

私には2つのクラスがあります:

@Entity
@Table(name = "DRCOMMENTS" ,schema = "XXX")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Drcomments.findAll", query = "SELECT d FROM Drcomments d"),
public class Drcomments implements Serializable {

private static final long serialVersionUID = 1L;

@EmbeddedId    
protected DrcommentsPK drcommentsPK;

@Size(max = 50)
@Column(name = "SDESC")
private String commentSecondaryCodeDescription;
}


@Embeddable
public class DrcommentsPK implements Serializable {

@Column(name = "CODE")
private Short commentPrimaryCode;

@NotNull   
@Column(name = "SCODE" , length=5)
private Short commentSecondaryCode;
}

動的な順序とパラメーターを使用してクエリを作成しようとしています。たとえば、DrcommentsPK.commentPrimaryCodeが1を取得したときに、すべてのDrcommentsレコードを選択したいのですが、順序はDrcommentsPK.commentSecondaryCodeになります。これは私が試したものです:

        CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Drcomments> q = cb.createQuery(Drcomments.class);
    Root<Drcomments> c = q.from(Drcomments.class);

    q.select(c);
    q.where(cb.equal(c.get("drcommentsPK").get("commentPrimaryCode"), 1));

    Path<Drcomments> valuePath = c.get("drcommentsPK").get("commentSecondaryCode"); 
    Order[] orders; 
    if(sord.equals("desc"))
    {  
    orders = new Order[] {cb.desc(valuePath)};
    } 
    else
    {  
    orders = new Order[] {cb.asc(valuePath)};
    } 
    q.orderBy(orders);

    query = em.createQuery(q);                
    query.setFirstResult(start);
    query.setMaxResults(start + limit);   

    results = query.getResultList();

問題は、取得した結果リストがcommentSecondaryCodeの説明順に並べ替えられていないことです。

私は何か間違ったことをしていますか?これはどのように行うことができますか?emeddableクラス内のフィールドによって順序付けられるクエリを作成する方法は?

更新: これは私が取得した生成されたSQLです:

SELECT * FROM 
(SELECT * FROM 
(SELECT EL_TEMP.*, ROWNUMBER() OVER() AS EL_ROWNM FROM 
(SELECT CMSSDESC AS a1, CMSSCODE AS a4, CMSPCODE AS a5 FROM DRCOMMENTS
 WHERE (CMSPCODE = 1) ORDER BY CMSSCODE DESC, CMSPCODE DESC)
 AS EL_TEMP) 
 AS EL_TEMP2 WHERE EL_ROWNM <= 50) 
 AS EL_TEMP3 WHERE EL_ROWNM > 0

このコードを実行すると、CMSSCODE descの順序でレコードが返されません。(順序は外側の選択にある必要があるためです。)との何かを変更する必要がquery.setFirstResult()ありquery.setMaxResults()ますか?基準クエリの最後に追加して、最後の選択に含めるにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

0

あなたのコードは問題なく、標準に準拠しています。動作しないことが確実な場合は、実装にバグがあるか、表示されていないコードの部分に奇妙なことがあるに違いありません。たとえば、 の値sordが正確である"desc"こと (大文字と小文字を区別) を確認します。そうしないと、昇順を使用することになります。

Hibernate 3.6.8.Final と EclipseLink (2.3.2) で試してみました。どちらも期待どおりに機能します-ORDER BY SCODE [ASC/DESC]実行されたSQLクエリの一部です。

于 2012-07-01T12:01:04.753 に答える