Существует ли способ, которым я могу считать размер связанного набора без инициализации?
например.
Select count(p.children) from Parent p
(существует серьезное основание, почему я не могу сделать этого никакого другого пути как моего, где пункт более сложен, и мой из пункта является полиморфным запросом),
Спасибо.
Возможным решением, помимо запросов, может быть отображение children
с lazy="extra"
(в нотации XML). Таким образом, вы можете получить родителя с помощью любого запроса, затем вызвать parent.getChildren().size()
без загрузки всей коллекции (выполняется только запрос типа SELECT COUNT
).
С аннотациями это будет
@OneToMany
@org.hibernate.annotations.LazyCollection(
org.hibernate.annotations.LazyCollectionOption.EXTRA
)
private Set<Child> children = new HashSet<Child>();
Обновление: Цитата из Java Persistence with Hibernate, гл. 13.1.3:
Прокси инициализируется при вызове любого метода, который не является getter идентификатора. метод, коллекция инициализируется, если вы начинаете итерацию по ее элементам или если вы вызываете любую из операций управления коллекцией, таких как
size()
иcontains()
. Hibernate предоставляет дополнительную настройку, которая в основном полезна для больших коллекций; они могут быть отображены как extra lazy. [...][отображено как выше,] коллекция больше не инициализируется, если вы вызываете
size()
,contains()
илиisEmpty()
- база данных запрашивается для получения необходимой информации. Если этоMap
илиList
, то операцииcontainsKey()
иget()
также напрямую запрашивают базу данных.
Так что с сущностью, отображенной, как указано выше, вы можете сделать
Parent p = // execute query to load desired parent
// due to lazy loading, at this point p.children is a proxy object
int count = p.getChildren().size(); // the collection is not loaded, only its size