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); 

此查询工作正常,但有时也可能在orderIds列表50-1000条目从外部发送功能之间的任何地方。所以它变得非常慢,需要5-6秒的时间,这不够快。我的问题是,有没有更好,更快的方法来做到这一点?当我在Google网站上搜索时,我发现我们可以使用ANY,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

您可以使用其中一个本地SQL查询,以及在HQL在JPA导致了大量的性能优势exists代替IN子句。请参考下面

样品JPA查询样品:

SELECT EMP FROM员工EMP JOIN emp.projects p其中NOT EXISTS(SELECT项目从工程项目,其中p =项目,并project.status <>“活动')