如何停止ID排序的JPA中具有IN子句的@query?

时间:2019-04-23 09:26:40

标签: spring-data-jpa

我必须通过传递2个参数从数据库中获取记录列表 第一个参数是“对象类型”,第二个参数是“集合”。

@Query(“从Content cnt中选择cnt,其中cnt.studio =?1和cnt.id IN?2”)

公共列表getUpdatePlaylistTypeContent(Studio studio,List contentids);

因此,在我上面提到的代码中,IN子句虽然没有提到,但还是自动通过id asc实现了订单。我想停止隐式order by子句。

我想要结果列表的方式与我传入列表对象(第二种方法参数)的方式相同

2 个答案:

答案 0 :(得分:0)

检查生成的SQL(例如,使用show_sql=true),我确定您不会看到任何ORDER BY子句。

但是,如果您在数据库上运行相同的SQL,则如果在id列上存在具有默认设置的索引(例如主键),则结果将按ID排序。

例如。 https://www.postgresql.org/docs/11/indexes-ordering.html

从数据库的角度来看,结果更像是集合而不是列表,因此您需要显式对其进行排序(或者对索引排序感到满意)。您不能依靠放在where子句中的任何内容来对结果进行排序,因此您需要进一步处理。

答案 1 :(得分:0)

它与JPA不相关,请在数据库中尝试sql。它会向您发出相同的命令。 检查您的数据库类型是否禁止自动排序;

Oracle

SELECT * FROM table where id IN (3,2,5,1,4) ORDER BY DECODE(id, 3,1,2,2,5,3,1,4) 
//you need the *,1,*,2,*,3,*,*

Mysql

select * from table where id IN (3,9,6) order by field(id,3,9,6)

我没有测试mysql,但是应该可以正常工作