0

У меня есть пользовательский запрос вдоль этих строк. Я получаю список orderIds извне. У меня есть весь список объектов заказа со мной, поэтому я могу изменить запрос каким-либо образом, если это необходимо.Быстрая/эффективная альтернатива предложению IN в пользовательских/собственных запросах в данных весны jpa

@Query("SELECT p FROM Person p INNER JOIN p.orders o WHERE o.orderId in :orderIds)") 
public List<Person> findByOrderIds(@Param("orderIds") List<String> orderIds); 

Этот запрос работает нормально, но иногда это может быть где-нибудь между 50-1000 записей в списке orderIds посланных от внешней функции. Таким образом, он становится очень медленным, занимая целых 5-6 секунд, что недостаточно быстро. Мой вопрос: есть ли лучший, более быстрый способ сделать это? Когда я googled, и на этом сайте, я вижу, мы можем использовать ЛЮБОЙ, EXISTS: Postgresql: alternative to WHERE IN respective WHERE NOT IN или создать временную таблицу: https://dba.stackexchange.com/questions/12607/ways-to-speed-up-in-queries-under-postgresql или присоединить это к предложению VALUES: Alternative when IN clause is inputed A LOT of values (postgreSQL). Все эти ответы настроены на прямые вызовы SQL, ничто не основано на JPA. Любое ключевое слово не поддерживается весенними данными. Не уверен в создании временных таблиц в пользовательских запросах. Я думаю, что могу сделать это с родными запросами, но не пробовал. Я использую spring-data + OpenJPA + PostgresSQL.

Можете ли вы предложить решение или дать указатели? Прошу прощения, если я что-то пропустил.

спасибо,

Алиса

ответ

0

Вы можете использовать WHERE EXISTS, а не в пункте в родном SQL Query, а также в HQL в JPA, что приводит много преимуществ по производительности. Пожалуйста, смотрите образец ниже

Образец JPA запроса:

ВЫБРАТЬ эй FROM EMP Сотрудника РЕГИСТРИРУЙТЕСЬ emp.projects р, где НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ проект от проекта проекта, где р = проект и project.status <> «Активных ')