Будьте в спящем режиме размер набора количества без инициализации

Существует ли способ, которым я могу считать размер связанного набора без инициализации?

например.

Select count(p.children) from Parent p

(существует серьезное основание, почему я не могу сделать этого никакого другого пути как моего, где пункт более сложен, и мой из пункта является полиморфным запросом),

Спасибо.

37
задан Péter Török 2 August 2010 в 11:27
поделиться

1 ответ

Возможным решением, помимо запросов, может быть отображение 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
60
ответ дан 27 November 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: