首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA2 Criteria-API:选择...in (select from where)

JPA2 Criteria-API:选择...in (select from where)
EN

Stack Overflow用户
提问于 2012-06-02 00:47:02
回答 4查看 8.4K关注 0票数 2

我有以下数据库模型:

代码语言:javascript
复制
A
aId

AB
aId
bId

B
bId
status

在Spring data Specification中,当B.status为'X‘时,我想返回A的实例。JPQL代码如下:

代码语言:javascript
复制
select a from A a where a in
     (select ab.id.a from AB ab where ab.id.b.status= :status)

以下是模型类:

代码语言:javascript
复制
@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规范中的JPA标准是怎样的?

代码语言:javascript
复制
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;
          }
        };
     }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-04 22:56:11

使用Criteria API返回A实例的规范如下:

代码语言:javascript
复制
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);
          }
        };
     }
}
票数 3
EN

Stack Overflow用户

发布于 2012-06-02 07:18:06

上一篇文章中包含了一些很好的示例,它们恰好解决了您在这里试图实现的目标:jpa-2-0-criteria-api-subqueries-in-expressions

票数 0
EN

Stack Overflow用户

发布于 2012-06-04 20:51:32

我想你想要选择"A entities from AB entities where B is is of provided status":

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10854334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档