代码之家  ›  专栏  ›  技术社区  ›  Aliaksei Stadnik

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

  •  10
  • Aliaksei Stadnik  · 技术社区  · 8 年前

    我有一个非常简单的查询,它根据“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 和/或 Hibernate .

    1 回复  |  直到 8 年前
        1
  •  9
  •   Michael Bat    5 年前

    你也可以通过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 ''.
    

    您可以在这里找到示例: https://stackoverflow.com/a/65943906/15101302