JPA-эквивалент Oracle TopLink для addBatchReadAttribute - PullRequest
1 голос
/ 27 сентября 2011

Мы используем 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

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

EclipseLink поддерживает несколько типов пакетной выборки.

См, http://java -persistence-performance.blogspot.com / 2010/08 / партии сгрузить-оптимизации объектно-graph.html

1 голос
/ 28 сентября 2011

Внутренне QueryHint "eclipselink.batch" переводится в addBatchAttribute (), поэтому поведение, которое вы видите, должно быть идентичным. Создает ли JPQL, который вы создали, тот же запрос, что и нативный API TopLink? Возможно, у вас есть Fetch или дополнительные объединения в JPQL?

...