【问题标题】:How to specify multiple conditions on left join using JPA Criteria API?如何使用 JPA Criteria API 在左连接上指定多个条件?
【发布时间】:2011-03-17 20:39:11
【问题描述】:

我想转换以下 SQL 查询:

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  

进入基于 JPA Crtieria 的查询。

我创建了一个实体来表示自连接:

@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  
}

我使用以下代码创建 JPA 查询

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

这是我运行这段代码时 Hibernate 自动生成的查询。

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=?  

我尝试了多种方法,包括删除 cq.where 代码行,但生成的查询与我原来的查询不匹配。是不是我配置错了?

【问题讨论】:

  • 显然,JPA 2.0 不支持额外的 ON 条件。它计划用于 2.1。您可以直接使用 Hibernate 的 API 来完成。

标签: java orm criteria-api jpa-2.0


【解决方案1】:

在创建连接后尝试调用cq.select(r);。如果没有cq.select(),最后一次cq.from() 调用的结果将用作选择根。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2020-05-16
    • 2016-11-09
    • 2021-04-20
    • 2011-02-19
    相关资源
    最近更新 更多