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