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
라인하지만 내 원래의 하나와 일치 할 수 생성 된 쿼리를 제거를 포함하여 여러 가지 방법을 시도했습니다. 내가 잘못 설정 한 적이 있습니까?
분명히 JPA 2.0은 추가 ON 조건을 지원하지 않습니다. 그것은 2.1 용으로 계획되어 있습니다. 당신은 Hibernate의 API를 직접 사용함으로써 그것을 할 수있다. – Thilo