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

Posted

技术标签:

【中文标题】Spring 数据存储库:findBySomething***In*** 和结果顺序【英文标题】:Spring data repository: findBySomething***In*** and result order 【发布时间】:2017-12-13 19:20:10 【问题描述】:

有没有什么方法可以让这些函数得到的结果按照提供给函数的列表(或集合)的顺序进行排序以进行 in 查找?

一个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...

【问题讨论】:

这里似乎有一个很好的解决方案:***.com/a/47042709/66686 【参考方案1】:

spring data 有两个变体,如何使用基于属性的标准顺序。

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)

如果您想对 case 使用自定义顺序,请排序: 颜色=“绿色”,颜色=“蓝色”,颜色=“青色”

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

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

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

【讨论】:

findBy... 变体对我不起作用。元素按colors 的自然顺序排序,但不是按照传递列表中定义的顺序。最后我对代码中的List进行了排序。【参考方案2】:

在我的例子中,我只是手动排序,因为我处理的不是很长的数组。

首先,您从数据库中以任何顺序检索元素,然后与您的颜色列表进行比较并进行相应的排序。

【讨论】:

【参考方案3】:

如果你想同时检索对象并保持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,请忽略它。应用程序将编译并且请求将正常工作。

【讨论】:

这真的有效吗?我得到“按项目排序不是一个有效的表达式”,当添加“nativeQuery = true”时,我得到一个输入或输出参数错误

以上是关于Spring 数据存储库:findBySomething***In*** 和结果顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何在服务类中隐藏spring数据存储库功能?

具有几何返回类型的 Spring 数据存储库和本机查询

找不到类型的属性...自定义 Spring 数据存储库

自定义 MongoDB Spring 数据存储库

加入spring数据查询存储库

存储库注释不适用于 Spring 数据 JPA