Hibernate jpa 2 CriteriaQuery不区分子实体

Hibernate jpa 2 CriteriaQuery不区分子实体,hibernate,jpa-2.0,criteriaquery,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

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

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都符合条件,但随后会抛出第二个查询以获取B实体

select * from b where aid = ?
这是错误的,因为选择应该是

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

我曾经遇到过这个问题,但我的查询没有使用CriteriaBuilder,它是通过使用JOIN FETCH解决的,但是使用CriteriaQuery我无法解决它。

好的,解决方法很简单,最后我只需添加一个从FETCH到JOIN的转换,这是最终的查询

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) );
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) );