Faster/efficient spring 数据 jpa 中 custom/native 查询中的 IN 子句的替代方法
Faster/efficient alternative to IN clause in custom/native queries in spring data jpa
我有一个沿着这些方向的自定义查询。我从外部获取 orderIds 列表。我有完整的订单对象列表,因此如果需要,我可以以任何方式更改查询。
@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 秒,这还不够快。我的问题是,有没有更好、更快的方法来做到这一点?当我用谷歌搜索时,在这个网站上,我看到我们可以使用 ANY, EXISTS: Postgresql: alternative to WHERE IN respective WHERE NOT IN or create a temporary table: https://dba.stackexchange.com/questions/12607/ways-to-speed-up-in-queries-under-postgresql or join this to VALUES clause: 。所有这些答案都是针对直接 SQL 调用量身定制的,没有任何基于 JPA 的内容。 spring-数据不支持任何关键字。不确定在自定义查询中创建临时表。我想我可以用本机查询来做到这一点,但还没有尝试过。我正在使用 spring-data + OpenJPA + PostgresSQL.
能否请您提出解决方案或指点?如果我遗漏了什么,我深表歉意。
谢谢,
爱丽丝
您可以在本机 SQL 查询以及 JPA 中的 HQL 中使用 WHERE EXISTS 而不是 IN 子句,这会带来很多性能优势。请参阅下面的示例
示例 JPA 查询:
SELECT emp FROM Employee emp JOIN emp.projects p where NOT EXISTS (SELECT project from Project project where p = project AND project.status < > 'Active')
我有一个沿着这些方向的自定义查询。我从外部获取 orderIds 列表。我有完整的订单对象列表,因此如果需要,我可以以任何方式更改查询。
@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 秒,这还不够快。我的问题是,有没有更好、更快的方法来做到这一点?当我用谷歌搜索时,在这个网站上,我看到我们可以使用 ANY, EXISTS: Postgresql: alternative to WHERE IN respective WHERE NOT IN or create a temporary table: https://dba.stackexchange.com/questions/12607/ways-to-speed-up-in-queries-under-postgresql or join this to VALUES clause:
能否请您提出解决方案或指点?如果我遗漏了什么,我深表歉意。
谢谢,
爱丽丝
您可以在本机 SQL 查询以及 JPA 中的 HQL 中使用 WHERE EXISTS 而不是 IN 子句,这会带来很多性能优势。请参阅下面的示例
示例 JPA 查询:
SELECT emp FROM Employee emp JOIN emp.projects p where NOT EXISTS (SELECT project from Project project where p = project AND project.status < > 'Active')