jpa 2 CriteriaQuery不区分子实体

时间:2015-02-06 22:44:21

标签: hibernate jpa-2.0 criteriaquery

我有一个与另一个实体有一对多关系的实体。说

1A -> 1.*B

我写了这个查询。

CriteriaBuilder cb = super.getEntityManager().getCriteriaBuilder();
CriteriaQuery<A> select = cb.createQuery(A.class);
Root<A> from = select.from(A.class);
Join<A, B> joinB = from.<A, B>join("b");
select.select(from);
select.where( cb.between(joinB.<Date>get("date"), dateA, dateB) );

问题:查询返回所有子实体,而不仅仅是那些符合 约束的实体。

所以即使 A 有3个孩子 B 并且只有两个符合条件,查询总会返回3 B&#39>

检查hibernate生成的sql,我可以看到这个。

select a from A where a_id = ? and b_date b.date between ? and ?

没问题,检索到的所有 A 实体都符合条件,但是会抛出第二个查询来获取 B 实体。

select * from b where aid = ?

这是错误的,因为select应该是

select * from b where aid = ? and b.date between ? and ?

我曾经遇到过这个问题,但是我的查询确实没有使用 CriteriaBuilder ,而是使用 JOIN FETCH 解决了这个问题,但是 CriteriaQuery < / em>我已经能够解决它。

1 个答案:

答案 0 :(得分:0)

好的,解决方案很简单(最后)我只需要将 fetch 的演员添加到加入,这是最终的查询。

CriteriaBuilder cb = super.getEntityManager().getCriteriaBuilder();
CriteriaQuery<A> select = cb.createQuery(A.class);
Root<A> from = select.from(A.class);
Join<A, B> joinB =   (Join<A, B>)  from.<A, B>fetch("b");//CAST.
select.select(from);
select.where( cb.between(joinB.<Date>get("date"), dateA, dateB) );