2010-07-19 2 views
3

나는 다음과 같은 SQL 쿼리를 변환하고 싶습니다 : JPA Crtieria 기반 쿼리에JPA Criteria API를 사용하여 왼쪽 조인에 여러 조건을 지정하는 방법은 무엇입니까?

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 

합니다. 내가 자기를 표현하는 엔티티를 생성

가입 :

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

내가

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

이 내가이 프로그램을 실행할 때 자동으로 절전 모드에 의해 생성 된 쿼리 인 JPA 쿼리를 만들려면 다음 코드를 사용 코드 조각.

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 라인하지만 내 원래의 하나와 일치 할 수 생성 된 쿼리를 제거를 포함하여 여러 가지 방법을 시도했습니다. 내가 잘못 설정 한 적이 있습니까?

+0

분명히 JPA 2.0은 추가 ON 조건을 지원하지 않습니다. 그것은 2.1 용으로 계획되어 있습니다. 당신은 Hibernate의 API를 직접 사용함으로써 그것을 할 수있다. – Thilo

답변

1

조인을 생성 한 후 cq.select(r);을 호출 해보십시오. cq.select()이 없으면 마지막 cq.from() 호출의 결과가 선택 루트로 사용됩니다.

관련 문제