Spring数据存储库:findBySomething ***在***和结果顺序中

时间:2017-07-10 06:58:59

标签: spring-data spring-data-jpa jpql

有没有办法让这些函数按照给查询函数的列表(或集合)的顺序排序结果?

spring数据存储库接口函数的简单示例:

public void List<Entity> findByColorIn(List<String> colors)

现在我创建一个字符串列表,其中包含“green”,“blue”,“cyan”,并调用此函数。

假设所有这三种颜色都有一个独特的匹配:

如何让函数按给定列表中给定的属性顺序返回结果?在这个例子中:

Entity[id=32, color="green"]
Entity[id=11, color="blue"]
Entity[id=22, color="cyan"]

在这种情况下不确定默认顺序,但我假设id ...

3 个答案:

答案 0 :(得分:2)

spring数据有两种变体api如何使用基于属性的标准顺序。

1变种:

public void List<Entity> findByColorInOrderByColorDesc(List<String> colors)
public void List<Entity> findByColorInOrderByColorAsc(List<String> colors)

2变种

Sort sort= new Sort(Sort.Direction.ASC/DESC,"color");
public void List<Entity> findByColorIn(List<String> colors , Sort sort)

如果您想对案例,排序顺序使用自定义顺序: 颜色=&#34;绿色&#34; ,color =&#34; blue&#34;,color =&#34; cyan&#34;

您需要根据排序逻辑使用变体2和自定义排序实现。

如果您的结果集很小,也可以获得未排序的结果并在服务器端对其进行排序。 spring数据可能会返回stream,因此您可以执行以下操作:

findByColorIn(colors).stream().sorted(comparator....).collect(Collectors.toList());

答案 1 :(得分:1)

在我的情况下,我只是手工分类,因为我没有处理很长的一系列项目。

首先,您可以按照它们的顺序从数据库中检索元素,然后与颜色列表进行比较并相应地对其进行排序。

答案 2 :(得分:0)

如果你想同时检索对象并保持 id 的顺序,你可以使用这个:

@Query("select p from Colour p where p.id in :colors order by FIELD(p.id,:colors)")
List<Color> getColorsByIdsOrdered(List<String> colors);

P.S.:如果 IntelliJ 或其他平台将 ,,FIELD'' 标记为 RED,请忽略它。应用程序将编译并且请求将正常工作。