jpa 2 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.

проверьте сгенерированный sql hibernate, я вижу это.

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 я не смог ее решить.

1 ответ

Решение

Хорошо, решение было простым (в конце), мне просто нужно было добавить приведение из 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) );
Другие вопросы по тегам