2016-05-17 2 views
0

Auf der Grundlage dieser Antwort https://stackoverflow.com/a/2111420/3989524 ich zum ersten Mal eine Arbeits SQL erstellt:JPA Criteria Abfrage verknüpft Doppel- und Hibernate Fehler-Klausel

SELECT d.* 
FROM device d 
LEFT OUTER JOIN installation_record ir1 ON (d.id = ir1.device) 
LEFT OUTER JOIN installation_record ir2 ON (d.id = ir2.device AND ir1.install_date < ir2.install_date) 
WHERE ir2.id IS NULL AND ir1.uninstall_date IS NULL; 

und dann eine Kriterien-Abfrage, die eine äquivalente HQL (am Ende) zu erzeugen, sieht , aber Hibernate wirft einen Fehler:

org.hibernate.hql.internal.ast.QuerySyntaxException: with-Klausel verwiesen werden zwei verschiedene from-Klausel Elemente

die HQL aus der Fehlermeldung:

SELECT generatedAlias0 FROM Device AS generatedAlias0 
LEFT JOIN generatedAlias0.installationRecordList AS generatedAlias1 
LEFT JOIN generatedAlias0.installationRecordList AS generatedAlias2 
WITH generatedAlias1.installDate<generatedAlias2.installDate 
WHERE (generatedAlias2.id IS NULL) AND (generatedAlias1.uninstallDate IS NULL) 

Die Kriterien query:

final CriteriaBuilder cb = em.getCriteriaBuilder(); 
final CriteriaQuery<Device> cq = cb.createQuery(Device.class); 
final Root<Device> root = cq.from(Device.class); 
final Join<Device, InstallationRecord> join1 = root.join(Device_.installationRecordList, JoinType.LEFT); 
final Join<Device, InstallationRecord> join2 = root.join(Device_.installationRecordList, JoinType.LEFT); 

join2.on(cb.lessThan(join1.get(InstallationRecord_.installDate), join2.get(InstallationRecord_.installDate))); 
cq.select(root); 

final List<Predicate> predicates = Lists.newArrayList(); 
predicates.add(cb.isNull(join2.get(InstallationRecord_.id))); 
predicates.add(cb.isNull(join1.get(InstallationRecord_.uninstallDate))); 
cq.where(predicates.toArray(new Predicate[] {})); 

return em.createQuery(cq).getResultList(); 

Gibt es trotzdem zu bekommen, was ich will oder es gibt keinen anderen Weg, um einige interne Hibernate Fehler.

+0

Ich frage mich, ist es mit einigen Einschränkungen der On-Methode verbunden. Hast du versucht, dein Prädikat in 'where' Statement zu verschieben? – user902383

Antwort

-1

Vielleicht:

final Join<InstallationRecord, InstallationRecord> join2 = root.join(InstallationRecord_.id, JoinType.LEFT); 

weil ON (d.id = ir2.device AND in der HQL fehlt.