Postgresql spring数据jpa中自定义/本机查询中IN子句的更快/高效替代方案

Postgresql spring数据jpa中自定义/本机查询中IN子句的更快/高效替代方案,postgresql,spring-data,database-performance,openjpa,query-performance,Postgresql,Spring Data,Database Performance,Openjpa,Query Performance,我有一个自定义查询。我从外部获取医嘱ID列表。我随身携带了整个order对象列表,因此如果需要,我可以以任何方式更改查询 @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); 此查询工作正常,但有时它可

我有一个自定义查询。我从外部获取医嘱ID列表。我随身携带了整个order对象列表,因此如果需要,我可以以任何方式更改查询

@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);
此查询工作正常,但有时它可能在从函数外部发送的OrderID列表中包含50-1000个条目。所以它变得非常慢,需要5-6秒,这还不够快。我的问题是,有没有更好更快的方法?当我在这个网站上搜索时,我发现我们可以使用ANY、EXISTS:或创建一个临时表:或将此连接到VALUES子句:。所有这些答案都是针对直接SQL调用定制的,没有基于JPA的。spring数据不支持任何关键字。不确定是否在自定义查询中创建临时表。我想我可以用本机查询来实现,但还没有尝试过。我使用的是SpringData+OpenJPA+PostgresSQL

你能提出一个解决方案或给点建议吗?如果我错过了什么,我道歉

谢谢


Alice

您可以在本机SQL查询以及JPA中的HQL中使用WHERE EXISTS而不是IN子句,这会带来很多性能优势。请看下面的示例

JPA查询示例:

从员工emp中选择emp加入emp.projects p(如果不存在)从项目中选择项目,其中p=项目,项目状态为“活动”