2012-06-01 47 views
2

我有以下的數據庫模型:JPA2標準的API:選擇...在(從那裏選擇)

A 
aId 

AB 
aId 
bId 

B 
bId 
status 

在Spring數據規範,我想回到A,此時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

返回一個使用標準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

謝謝codeturner。不幸的是,該鏈接中的示例並不能幫助我使用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