복붙노트

[SPRING] JPA2 Criteria-API : select ... in (어디에서 선택 하시겠습니까?)

SPRING

JPA2 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. ==============================

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

    2.jpa-2-0-criteria-api-subqueries-in-expressions에는 여기에 달성하려는 내용을 정확히 다루는 이전 게시물에 몇 가지 좋은 예가 포함되어 있습니다.

    jpa-2-0-criteria-api-subqueries-in-expressions에는 여기에 달성하려는 내용을 정확히 다루는 이전 게시물에 몇 가지 좋은 예가 포함되어 있습니다.

  3. ==============================

    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));
    
  4. from https://stackoverflow.com/questions/10854334/jpa2-criteria-api-select-in-select-from-where by cc-by-sa and MIT license