9

javax.persistence.criteria.CriteriaBuilderを使用したクエリの作成で問題が発生しました。EclipseLink2.1とOracle10gデータベースを使用しています。複数の制限があるクエリを作成する場合、最初の制限のみが使用され、両方は使用されません。

これが私のコードです:

CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Assignment> query = cb.createQuery(Assignment.class);
Root<Assignment> assignment = query.from(Assignment.class);

query.where(
    cb.equal(assignment.get("request"), request),
    cb.isNull(assignment.get("endDate")));

return getEm().createQuery(query).getResultList();

生成されるクエリは次のとおりです。

SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS, 
       ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY, 
       ASSX_RQST_ID 
FROM TARTS.ASSIGNMENT_XREF 
WHERE (ASSX_RQST_ID = ?)

where句を除いて見栄えがします。私は期待している:

SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS, 
       ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY, 
       ASSX_RQST_ID FROM TARTS.ASSIGNMENT_XREF 
WHERE (ASSX_RQST_ID = ? AND BEGIN_DATE IS NOT NULL)

cb.and(arg1、arg2)を使用するかどうかは関係ありません。私は何か間違ったことをしていますか?どんな助けでもありがたいです。

4

1 に答える 1

4

クエリは完全に問題ないようです。あなたが言及したように、CriteriaQuery.where(Predicate... restrictions)すでに述語の接続詞を使用しているので、cb.and()を使用する必要はありません。

私が想像できる唯一のもの:

  • EclipseLinkのバグ(Hibernateでも同じことを試してください)
  • ある種の最適化、多分endDate決してnullではないかもしれませんか?
  • getEm()メソッドはいくつかの奇妙なことをします
于 2011-07-06T10:08:36.700 に答える