我有一个与另一个实体有一对多关系的实体。说
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) );
问题:查询返回所有子实体,而不仅仅是那些满足between约束的子实体。
所以即使A有 3 个子B并且只有两个符合条件,查询总是返回 3 B's。
签入休眠生成的sql,我可以看到这个。
select a from A where a_id = ? and b_date b.date between ? and ?
这很好,检索到的所有实体A都符合条件,但随后会引发第二个查询以获取B实体。
select * from b where aid = ?
这是错误的,因为选择应该是
select * from b where aid = ? and b.date between ? and ?
我曾经遇到过这个问题,但是我的查询没有使用CriteriaBuilder,并且通过使用JOIN FETCH解决了,但是使用CriteriaQuery我无法解决它。