select i from item i left join fetch i.bids b where b.amount > 20
, поскольку HQL недопустим. Поскольку результаты HQL используются для возврата объектов Item , вы не можете указать спящему режиму создать объекты Item
, но при его создании не заполняйте его all Bid
s но заполнять только Bid
s с суммой больше 20.
Рассмотрим следующий класс
public class Item {
String name;
Collection<Bid> bids;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Collection<Bid> getBids() {
return bids;
}
public void setBids(Collection<Bid> bids) {
this.bids = bids;
}
}
Обновление: (Давайте рассмотрим пример, чтобы увидеть, что бы произошло если спящий режим разрешил этот запрос)
Обновление: (Давайте рассмотрим пример, если спящий режим разрешил этот запрос)
Основные проблемы, если спящий режим позволил этому случиться:
- Первая проблема, это будет концептуально неправильно, потому что любая служба, использующая объект item1 java, который был возвращенный из репо не знает item.getBids содержит только ставку с суммой> 20
- Hibernate сохраняет только одну ссылку на объект для представления сущности базы данных в сеансе ( Гарантия повторного чтения, грязная проверка и т. д. c). Итак, если вы сделаете еще один
Select i from Item i where i.itemId = 1
, у спящего режима возникнет проблема, потому что теперь у него должно быть два объекта java для представления элемента 1 в этом сеансе (один со ставками, где сумма> 20, а другой со всеми ставками элемента1)
Надеюсь, это ясно объясняет, почему запрос не может быть разрешен