当前位置: 首页 > 面试题库 >

如何保持Spring Data JPA或Hibernate中“ in”子句中提供的顺序

戚鸿福
2023-03-14
问题内容

我有一个非常简单的查询,该查询基于“ 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 Dataand / 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 |
+----+


 类似资料:
  • 问题内容: 是否可以保留“ IN”条件子句的顺序? 我在SO上发现了这个问题,但在他的示例中,OP已经有一个排序的“ IN”子句。 我的情况不同,’IN’子句的顺序是随机的: 我想按(45,2,445,12,789)顺序检索结果。我正在使用Oracle数据库。也许SQL中有一个属性,我可以将其与条件子句一起使用以指定保持子句的顺序。 问题答案: 除非您使用ORDER BY子句..否则不会有可靠的排

  • 问题内容: 使用SELECT WHERE IN()时,是否可以保持顺序?例如,使用以下查询: 结果将使用ID的默认顺序返回。1,7,54,55,56 当我想保留IN中使用的顺序时:56,55,54,1,7 有没有一种快速的方法可以在MySQL中执行此操作,或者我将被迫在代码后对其进行排序? 问题答案: 使用FIND_IN_SET:

  • 问题内容: 我想知道是否有按IN()子句中的值顺序进行排序的方法(可能是一种更好的方法)。 问题是我有2个查询,一个查询获取所有ID,第二个查询获取所有信息。第一个创建我要第二个排序的ID的顺序。这些ID以正确的顺序放入IN()子句中。 因此,它类似于(极其简化): 问题在于第二个查询不会以将ID放入IN()子句中的顺序来返回结果。 我发现的一种解决方案是将所有ID放入具有自动递增字段的临时表中,

  • 问题内容: 我正在从具有整数id值的大型表(数百万行)中选择一组帐户记录。从某种意义上说,查询是最基本的。我正在做的是建立一个大型的逗号分隔列表,并将其作为“ in”子句传递到查询中。现在,结果是完全无序的。我想做的是按“ in”子句中的值顺序返回结果。 我想我将不得不建立一个临时表并进行联接,这是我想避免的,但可能无法做到。 有什么想法吗?现在,由于我们正试图限制输出大小,每个查询的大小上限为6

  • 问题内容: 我知道这个问题已经发布了很多次,但是我想询问详细信息, 使用Oracle,您不能向IN子句传递1000个以上的参数,因此,将hibernate与oracle结合使用可以解决此问题,例如: 1-对于每个1000个参数列表,在IN子句之间使用OR子句,但这不适用,因为oracle的另一个限制是整个查询参数不超过2000 2-使用for循环,每次以1000个参数列表的形式运行查询,然后附加所

  • 问题内容: 我想知道是否有按IN()子句中的值顺序进行排序的方法(可能是一种更好的方法)。 问题是我有2个查询,一个查询获取所有ID,第二个查询获取所有信息。第一个创建我要第二个排序的ID的顺序。这些ID以正确的顺序放入IN()子句中。 因此,它类似于(极其简化): 问题在于第二个查询不会以将ID放入IN()子句中的顺序来返回结果。 我发现的一种解决方案是将所有ID放入具有自动递增字段的临时表中,