2012-06-01 3 views
2

У меня есть следующие модели базы данных:JPA2 Критерии-API: выберите ... в (выбрать где)

A 
aId 

AB 
aId 
bId 

B 
bId 
status 

в спецификации Spring данных, я хочу, чтобы вернуть экземпляры А, когда B.status это «X». Код 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; 
} 

Как бы быть критерии JPA в спецификации Spring?

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

ответ

2

Спецификация, которая возвращает экземпляры с использованием Criteria API является следующее:

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); 
      } 
     }; 
    } 
} 
0

Есть некоторые хорошие примеры, включенные в предыдущем посте, что решить, что именно вы пытаетесь достичь здесь: jpa-2-0-criteria-api-subqueries-in-expressions.

+0

Спасибо, что у вас есть. К сожалению, примеры в этой ссылке не помогают мне с embeddedId. В моем случае у меня нет атрибута отображения для subQuery. Мне нужно aId, но ABPK имеет A, а не aId. – Techky

0

Я полагаю, вы хотите, чтобы выбрать «А объекты из субъектов AB, где B является предоставленным статусом»:

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)); 
+0

Это также работает – Techky

+0

Также имеет в виду, что? – JMelnik

+0

Ссылаясь на ответ, который я предоставил с типом сейфа. Спасибо! – Techky

Смежные вопросы