Мы используем JPA, и когда коллекция объектов возвращается из запроса, для каждого «дочернего» объекта, связанного через внешний ключ, выполняется отдельный запрос.
Например, в нашем классе сущностей Authorization у нас есть следующий сопоставленный объект Client:
@JoinColumn(name = "clientId", referencedColumnName = "clientId")
@ManyToOne (fetch = FetchType.LAZY)
@NotNull(groups = Default.class)
private Client client;
Когда возвращается 10 авторизаций, выполняется 10 клиентских запросов. В TopLink мне удалось довести это число до единицы с помощью метода addBatchReadAttribute () класса ReadAllQuery. Согласно документации TopLink, «при обращении к какой-либо из пакетных частей все части будут прочитаны в одном запросе, это позволяет всем данным, необходимым для чтения частей в одном запросе, вместо (n) запросов . "
Это сработало отлично, предоставив нам один запрос с использованием предложения IN с 10 идентификаторами.
То, что я читал о re: JPA указал мне на пакетное соединение или что-то вроде:
hints = {@QueryHint(name = "eclipselink.batch", value = "p.client"), ...
Эта стратегия помогает сократить количество запросов,
- но это также дало мне больше объединений, возможно, замедляя (?)
некоторые запросы
- и, похоже, это не помогло так сильно, как вызов TopLink.
Есть ли способ получить стратегию, которая использует один запрос с IN в предложении WHERE?
Заранее спасибо.
Dave