我有以下数据库模型:
A
aId
AB
aId
bId
B
bId
status在Spring data Specification中,当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规范中的JPA标准是怎样的?
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;
}
};
}
}发布于 2012-06-04 22:56:11
使用Criteria 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);
}
};
}
}发布于 2012-06-02 07:18:06
上一篇文章中包含了一些很好的示例,它们恰好解决了您在这里试图实现的目标:jpa-2-0-criteria-api-subqueries-in-expressions。
发布于 2012-06-04 20:51:32
我想你想要选择"A entities from AB entities where B is is of provided status":
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));https://stackoverflow.com/questions/10854334
复制相似问题