如何保持 "in" 子句中提供的顺序 Spring Data JPA 或 Hibernate
How to keep order provided in "in" clause in Spring Data JPA or Hibernate
我有一个非常简单的查询,它根据 "in" 子句检索值。作为 "in" 参数出现的列表已适当排序。
查询:
@Query(value = "select i from ItemEntity i where i.secondaryId in :ids")
List<ItemEntity> itemsIn(@Param("ids") List<UUID> ids, Pageable pageable);
我需要按与 List<UUID> ids
相同的方式对结果进行排序,是否可以在没有普通 sql 的情况下实现这一点,而只能借助 Spring Data
and/or Hibernate
.
您也可以通过 JPA 做到这一点,但您必须按照您想要的顺序创建一个逗号分隔的 ID 列表。在你的情况下,你可以保持相同的顺序。
@Query(value = "select i from ItemEntity i where i.secondaryId in :ids
order by FIND_IN_SET(i.secondaryId, :idStr)")
List<ItemEntity> itemsIn(@Param("ids") List<UUID> ids, @Param("idStr") String idStr);
要创建逗号分隔列表,您可以 java 8 流:
ids.stream().map(Object::toString).collect(Collectors.joining(","));
示例:
SELECT id FROM User WHERE id in (2,3,1)
ORDER BY FIND_IN_SET(id,"2,3,1");
结果:
+----+
| id |
+----+
| 2 |
| 3 |
| 1 |
+----+
还有一种使用 JPQL 的替代方法:
You can use ,,FIELD'' instead of ,,FIND_IN_SET ''.
您可以在此处找到示例:
我有一个非常简单的查询,它根据 "in" 子句检索值。作为 "in" 参数出现的列表已适当排序。
查询:
@Query(value = "select i from ItemEntity i where i.secondaryId in :ids")
List<ItemEntity> itemsIn(@Param("ids") List<UUID> ids, Pageable pageable);
我需要按与 List<UUID> ids
相同的方式对结果进行排序,是否可以在没有普通 sql 的情况下实现这一点,而只能借助 Spring Data
and/or Hibernate
.
您也可以通过 JPA 做到这一点,但您必须按照您想要的顺序创建一个逗号分隔的 ID 列表。在你的情况下,你可以保持相同的顺序。
@Query(value = "select i from ItemEntity i where i.secondaryId in :ids
order by FIND_IN_SET(i.secondaryId, :idStr)")
List<ItemEntity> itemsIn(@Param("ids") List<UUID> ids, @Param("idStr") String idStr);
要创建逗号分隔列表,您可以 java 8 流:
ids.stream().map(Object::toString).collect(Collectors.joining(","));
示例:
SELECT id FROM User WHERE id in (2,3,1)
ORDER BY FIND_IN_SET(id,"2,3,1");
结果:
+----+
| id |
+----+
| 2 |
| 3 |
| 1 |
+----+
还有一种使用 JPQL 的替代方法:
You can use ,,FIELD'' instead of ,,FIND_IN_SET ''.
您可以在此处找到示例: