2011-07-04 12 views
7

javax.persistence.criteria.CriteriaBuilderでクエリを作成する際に問題が発生しています。私は、EclipseLink 2.1とOracle 10gデータベースを使用しています。複数の制限付きのクエリを作成する場合は、最初の制限のみを使用し、両方を使用することはありません。Jpa QueryBuilder where節の複数の式が機能しない

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(); 

productedクエリは次のとおりです:

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)を使用するかどうかは関係ありません。私は何か間違っているのですか?どんな助けもありがとう。

+0

あなたcb.isNullはisNotNullする必要がありますいくつかの奇妙なことを行います。制限を追加しようとしましたか、明示的に接続を定義しようとしましたか? – jelle

答えて

4

あなたの質問は完全にokです。あなたが言及したように、CriteriaQuery.where(Predicate... restrictions)はすでに述語の結合を使用しているので、cb.and()を使う必要はありません。私が想像できる

唯一のもの:EclipseLinkの中

  • バグ(休止状態と同じにしてみてください)
  • 最適化のいくつかの並べ替え、多分endDateはnullになることはありませんこと?
  • あなたgetEm()メソッドは、
+0

多くの研究の後、この非常に問題があるEclipseLinkのバグhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=316144が見つかりました。 2.3にアップグレードした後、それは素晴らしい作品です! – Miller

関連する問題