[SPRING] JPA2 Criteria-API : select ... in (어디에서 선택 하시겠습니까?)
SPRINGJPA2 Criteria-API : select ... in (어디에서 선택 하시겠습니까?)
나는 다음과 같은 데이터베이스 모델을 가지고있다 :
A
aId
AB
aId
bId
B
bId
status
Spring 데이터 사양에서 B.status가 'X'일 때 A의 인스턴스를 반환하려고합니다. JPQL 코드는 다음과 같습니다.
select a from A a where a in
(select ab.id.a from AB ab where ab.id.b.status= :status)
다음은 모델 클래스입니다.
@Entity
public class A {
private Long aId;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "id.a")
private Set<AB> ab;
}
@Entity
public class B {
private Long bId;
private String Status;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "id.b")
private Set<AB> ab;
}
@Entity
public class AB {
private ABPK id;
}
public class ABPK {
@ManyToOne
@JoinColumn(name="aId")
private A a;
@ManyToOne
@JoinColumn(name="bId")
private B b;
}
Spring Specification에서 JPA Criteria는 어떻게 될 것입니까?
public class ASpecifications {
public static Specification<A> test(final String status) {
return new Specification<Party>() {
@Override
public Predicate toPredicate(Root<A> a, CriteriaQuery<?> query, CriteriaBuilder cb) {
return null;
}
};
}
}
해결법
-
==============================
1.기준 API를 사용하여 A의 인스턴스를 반환하는 사양은 다음과 같습니다.
기준 API를 사용하여 A의 인스턴스를 반환하는 사양은 다음과 같습니다.
public class ASpecifications { public static Specification<A> test(final String status) { return new Specification<Party>() { @Override public Predicate toPredicate(Root<A> a, CriteriaQuery<?> query, CriteriaBuilder cb) { Subquery<A> sq = query.subquery(A.class); Root<AB> ab = sq.from(AB.class); sq.select(ab.get(AB_.id).get(ABPK_.a)); sq.where(cb.equal(ab.get(AB_.id).get(ABPK_.b).get(B_.status), status)); Predicate p = cb.in(a).value(sq); return cb.and(p); } }; } }
-
==============================
2.jpa-2-0-criteria-api-subqueries-in-expressions에는 여기에 달성하려는 내용을 정확히 다루는 이전 게시물에 몇 가지 좋은 예가 포함되어 있습니다.
jpa-2-0-criteria-api-subqueries-in-expressions에는 여기에 달성하려는 내용을 정확히 다루는 이전 게시물에 몇 가지 좋은 예가 포함되어 있습니다.
-
==============================
3."B가 제공되는 상태 인 AB 엔터티에서 엔터티"를 선택하려고한다고 가정합니다.
"B가 제공되는 상태 인 AB 엔터티에서 엔터티"를 선택하려고한다고 가정합니다.
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<A> cq = cb.createQuery(A.class); Root<AB> ab = cq.from(AB.class); cq.select(ab.get("id").get("a")); cq.where(cb.equal(ab.get("id").get("b.status"), status));
from https://stackoverflow.com/questions/10854334/jpa2-criteria-api-select-in-select-from-where by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 기반 웹 애플리케이션에서 만료 된 세션 처리 (0) | 2019.02.12 |
---|---|
[SPRING] Spring Data JPA로 업데이트 쿼리를 통해 발행 된 변경 사항을 볼 수없는 이유는 무엇입니까? (0) | 2019.02.12 |
[SPRING] 클라이언트 비밀없이 Spring OAuth2 서버로부터 access_token을 얻을 수 있습니까? (0) | 2019.02.12 |
[SPRING] 어쨌든 @ Inject / @ Autowire로 내부 클래스를 외부 클래스에 넣으시겠습니까? (0) | 2019.02.12 |
[SPRING] spring-3.1로 업그레이드하면 내 사용자 정의 WebArgumentResolver가 손상되는 것 같습니다. (0) | 2019.02.12 |