2010-08-01 10 views
6

Ho riscontrato problemi con Hibernate EntityManager 3.5.3-Finale quando si tratta di predicati compositi.Criteri JPA 2.0 e raggruppamento di predicati

Esempio (non reale frammento di codice, ma l'idea deve essere chiaro):

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
Predicate predicate1 = criteriaBuilder.conjunction(); 
Predicate predicate2 = criteriaBuilder.conjunction(); 
// These are Boolean expression with common Root 
predicate1.getExpressions().add(expression1); 
predicate1.getExpressions().add(expression2); 
predicate2.getExpressions().add(expression3); 
predicate2.getExpressions().add(expression4); 
//... 
query.where(criteriaBuilder.or(predicate1, predicate2)); 

Ora, mi sarei aspettato qualcosa di simile:

SELECT ... FROM ... WHERE (expression1 AND expression2) OR (expression3 AND expression4) 

Tuttavia io alla fine con:

SELECT ... FROM ... WHERE expression1 AND expression2 OR expression3 AND expression4 

Sto facendo qualcosa di terribilmente sbagliato o è un problema di ibernazione?

risposta

6

In base alle specifiche SQL, entrambe le istruzioni indicano la stessa cosa. Non importa se l'istruzione contiene() o meno, quindi Hibernate non li usa. L'ordine di precedenza è simile a questo, simile a 1 + 2 * 3 è uguale a 1+ (2 * 3).

+0

È un peccato che il raggruppamento non sia più esplicito, ma per quanto riguarda il risultato finale, naturalmente, il tuo è giusto. – jarekrozanski

+0

Hai ragione, il raggruppamento esplicito sarebbe molto meglio. –