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

Schreibe einen Kommentar