Wie mehrere Bedingungen anzugeben, die auf left join mit JPA Criteria API?
Ich würde gerne konvertieren Sie die folgende SQL-Abfrage:
select * from region_tree country left outer join region_tree region
on country.REG_CODE_PAR=region.REG_CODE
and region.LFT < country.LFT
and region.RGT > country.RGT
and region.REG_CODE_PAR = 'ALL'
and COUNTRY.STATUS_CODE = 'A'
and REGION.STATUS_CODE = 'A
in JPA Crtieria basierten Abfrage.
Erstellte ich eine Entität zur Darstellung der self-join:
@Entity
@Table(name = "REGION_TREE")
public class RegionTree implements Serializable {
... some other attributes
@ManyToOne
@JoinColumn(name = "REG_CODE_PAR")
private RegionTree region;
... getters and setters
}
Ich verwendete den folgenden code zum erstellen der JPA query
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<RegionTree> cq = cb.createQuery(RegionTree.class);
Root<RegionTree> e = cq.from(RegionTree.class);
Join<RegionTree, RegionTree> r = e.join("region", JoinType.LEFT);
Predicate p1 = cb.greaterThan(e.get("lft").as(Integer.class), r.get("lft").as(Integer.class));
Predicate p2 = cb.lessThan(e.get("rgt").as(Integer.class), r.get("rgt").as(Integer.class));
Predicate p3 = cb.equal(e.get("statusCode"), "A");
Predicate p4 = cb.equal(r.get("statusCode"), "A");
Predicate p5 = cb.equal(r.get("regCodePar"), "ALL");
cq.where(p1,p2,p3,p4,p5);
TypedQuery<RegionTree> tq = em.createQuery(cq);
l = tq.getResultList();`
Dies ist die Abfrage automatisch generiert durch Hibernate wenn ich dieses Stück code.
select
regiontree0_.REG_CODE as REG1_7_,
regiontree0_.LFT as LFT7_,
regiontree0_.NAME as NAME7_,
regiontree0_.REG_CODE_PAR as REG4_7_,
regiontree0_.RGT as RGT7_,
regiontree0_.STATUS_CODE as STATUS6_7_
from
REGION_TREE regiontree0_
left outer join
REGION_TREE regiontree1_
on regiontree0_.REG_CODE_PAR=regiontree1_.REG_CODE
where
cast(regiontree0_.LFT as integer)>cast(regiontree1_.LFT as integer)
and cast(regiontree0_.RGT as integer)<cast(regiontree1_.RGT as integer)
and regiontree0_.STATUS_CODE=?
and regiontree1_.STATUS_CODE=?
and regiontree1_.REG_CODE_PAR=?
Ich habe versucht eine Reihe von Möglichkeiten, einschließlich entfernen der cq.where
Zeile code, aber die erzeugte Abfrage nicht entsprechen meinem original. Habe ich etwas falsch konfiguriert?
Offenbar, JPA 2.0 unterstützt nicht extra AUF die Bedingungen. Es ist geplant 2.1. Sie können es tun, durch die Verwendung von Hibernate-API direkt.
InformationsquelleAutor Jonathan | 2010-07-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie es aufrufen
cq.select(r);
nach dem erstellen einer Verknüpfung. Ohnecq.select()
das Ergebnis der letztencq.from()
Aufruf wird eine Auswahl Wurzel.InformationsquelleAutor Nick