JPA 2.0: пакетный запрос, безопасный и эффективный? - PullRequest
2 голосов
/ 29 февраля 2012

Я ищу JPA-решение (независимое от поставщика) для выполнения запроса в пакетном режиме. Задача состоит в том, чтобы сделать это как быстродействующим, так и безопасным.

Пример запроса:

Query query = em.createQuery("select e from Entity e where e.property in :list");

Список представляет собой коллекцию размером от 1 до 385000. Следовательно, требуется пакетный запрос.

Первоначально наивный подход состоял в том, чтобы получить подсписок из исходного списка и выполнить цикл до завершения. Это было безопасно и работало хорошо, за исключением того, что оно не было эффективным.

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

Буду очень признателен за предложения найти эффективный и безопасный способ решения этой проблемы.

Спасибо

1 Ответ

2 голосов
/ 29 февраля 2012

Во-первых, запрос не является допустимым JPQL, поскольку у него нет условия выбора.

Во-вторых, он должен быть where e.property in (:list).

Ваша стратегия заполнениявременная таблица выглядит хорошо для меня.Вы можете просто сделать так, чтобы он содержал дополнительный столбец uuid, и генерировать новый UUID каждый раз, когда вы хотите выполнить такой запрос:

  • генерировать UUID
  • вставлять все элементыlist в таблице со столбцом uuid, установленным в сгенерированный UUID
  • , выполнить запрос, такой как select e from Entity e, TempEntity temp where e.property = temp.property and temp.uuid = :uuid
  • , выполнить запрос, чтобы удалить все строки из временной таблицы (не обязательно)): delete from TempEntity temp where temp.uuid :uuid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...