2011-07-04 4 views
7

Je rencontre un problème avec la création de requêtes avec javax.persistence.criteria.CriteriaBuilder. J'utilise EclipseLink 2.1 et une base de données Oracle 10g. Lors de la construction d'une requête avec plusieurs restrictions, elle n'utilisera que la première restriction, pas les deux.Jpa QueryBuilder Expressions multiples dans where clause ne fonctionnant pas

Voici mon code:

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

La requête est 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 = ?) 

Il semble bon, sauf pour la clause where. J'attends:

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) 

Peu importe si j'utilise cb.and (arg1, arg2) ou non également. Est-ce que je fais quelque chose de mal? Toute aide serait appréciée.

+0

Votre cb.isNull devrait être isNotNull. Avez-vous essayé d'ajouter plus de restrictions et/ou essayé de définir explicitement votre conjonction? – jelle

Répondre

4

Votre requête semble parfaitement bien. Comme vous l'avez mentionné, CriteriaQuery.where(Predicate... restrictions) utilise déjà la conjonction des prédicats, il n'est donc pas nécessaire d'utiliser cb.and().

Les seules choses que je pouvais imaginer:

  • bug dans EclipseLink (essayez la même chose avec Hibernate)
  • une sorte d'optimisation, peut-être endDate ne peut jamais être nulle?
  • votre méthode Getem() fait des choses étranges
+0

Après beaucoup de recherches, j'ai trouvé un bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=316144 dans EclipseLink avec ce problème. Après la mise à niveau vers 2.3 cela fonctionne très bien! – Miller