Spring Data JPA - JpaRepository 中的自定义排序

2024-02-16

我正在将 Spring Data JPA 与 Spring Data REST 一起使用,并且我已经为我的 JpaRepository 创建了一个 JpaRepositoryThing entity.

@Repository
public interface ThingRepository extends JpaRepository<Thing, Long> {

    @RestResource(path = "findByName", rel = "findByName")
    Page findByName(@Param("name") String name, Pageable page);

}

我想应用排序。我想排序Thing基于自定义评级算法的列表。

List<Thing> sortByRating(List<Thing> things){

    // custom logic

    return things;
};

我希望如果可能的话使用自定义函数来对结果进行排序。 Spring JPA 中处理此类事情的最佳方法是什么?如何让我的存储库使用我的函数对结果集进行排序?


Spring Data 提供了基本的排序,如图所示here http://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-six-sorting/。您还可以使用以下方式注释您的查询@Query并使用order by,但我相信你需要的是更复杂的排序逻辑。

如果您使用 Java 8,您可以使用其功能对列表进行排序,this http://www.leveluplunch.com/java/tutorials/007-sort-arraylist-stream-of-objects-in-java8/文章展示了很好的例子,这需要更多的工作,但看起来就像你所追求的。请注意,为了从stream to list你必须包括.collect(Collectors.toList());在结束时stream.

示例(摘自文章):

employees.stream().sorted((Employee e1, Employee e2) -> e1.getHireDate()
                        .compareTo(e2.getHireDate())).collect(Collectors.toList());

Edit: 我没有注意到你使用分页。我遇到了类似的问题,在返回之前我必须对页面内容进行一些操作Page对象,所以我最终创建了一个扩展PageImpl<T> class:

public class PageImplBean<T> extends PageImpl<T> {

    private static final long serialVersionUID = 1L;
    private int number;
    private int size;
    private int totalPages;
    private int numberOfElements;
    private long totalElements;
    private boolean previousPage;
    private boolean first;
    private boolean nextPage;
    private boolean last;
    private List<T> content;
    @JsonIgnore
    private Sort sort;

    public PageImplBean() {
        super(new ArrayList<T>());
    }

    public PageImplBean(Page pagina){
        super(new ArrayList<T>());
        this.number = pagina.getNumber();
        this.size = pagina.getSize();
        this.totalPages = pagina.getTotalPages();
        this.numberOfElements = pagina.getNumberOfElements();
        this.totalElements = pagina.getTotalElements();
        this.previousPage = pagina.hasPrevious();
        this.first = pagina.isFirst();
        this.nextPage = pagina.hasNext();
        this.last = pagina.isLast();
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(int totalPages) {
        this.totalPages = totalPages;
    }

    public int getNumberOfElements() {
        return numberOfElements;
    }

    public void setNumberOfElements(int numberOfElements) {
        this.numberOfElements = numberOfElements;
    }

    public long getTotalElements() {
        return totalElements;
    }

    public void setTotalElements(long totalElements) {
        this.totalElements = totalElements;
    }

    public boolean isPreviousPage() {
        return previousPage;
    }

    public void setPreviousPage(boolean previousPage) {
        this.previousPage = previousPage;
    }

    public boolean isFirst() {
        return first;
    }

    public void setFirst(boolean first) {
        this.first = first;
    }

    public boolean isNextPage() {
        return nextPage;
    }

    public void setNextPage(boolean nextPage) {
        this.nextPage = nextPage;
    }

    public boolean isLast() {
        return last;
    }

    public void setLast(boolean last) {
        this.last = last;
    }

    public List<T> getContent() {
        return content;
    }

    public void setContent(List<T> content) {
        this.content = content;
    }

    public Sort getSort() {
        return sort;
    }

    public void setSort(Sort sort) {
        this.sort = sort;
    }

    public PageImpl<T> pageImpl() {
        return new PageImpl<T>(getContent(), new PageRequest(getNumber(),
                getSize(), getSort()), getTotalElements());
    }
}

对于你的情况来说重要的是setContent基类中不存在的方法。您可以将其与排序方法一起使用:

PageImplBean<Thing> page = //call your rest repository
List<Thing> pageContent = page.getContent();
page.setContent(sortByRating(pageContent));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data JPA - JpaRepository 中的自定义排序 的相关文章

  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 在谷歌大查询中将表从一个数据集复制到另一个数据集

    我打算将一组表从一个数据集复制到同一项目中的另一个数据集 我在 Ipython 笔记本中执行代码 我使用以下代码获取要复制到变量 value 中的表名列表 list bq DataSet test TestDataset for x in
  • Android:id列表视图

    我在 xml 中声明了一个列表视图
  • 每次 ComboBox 更改(使用 SelectedIndexChanged)时,如果打开,则以其他形式显示新值的消息

    我想从 Form1 组合框中获取所选语言 并启用其他表单来查看该语言 该组合框大约有 20 种语言 所以是的 您可以说相当多的语言 我有一个名为 ComboBoxLang SelectedIndexChanged 的 方法 当组合框中的语言
  • 设置 codeDOM 文件的文件版本

    我正在寻找任何方法来设置使用 codeDOM 生成的 exe 文件的文件版本 我的总是显示为 0 0 0 0 以编程方式显然是首选 但在这一点上 任何事情都比没有好 已编译程序集的版本由 AssemblyFileVersion 属性控制 您
  • Windows 中的 Git 符号链接

    我们的开发人员混合使用基于 Windows 和 Unix 的操作系统 因此 在 Unix 机器上创建的符号链接成为 Windows 开发人员的一个问题 在 Windows 中 MSysGit https github com msysgit
  • 无法使用 Vue.config.delimiters,只能在 new Vue() 上设置分隔符

    As per 这个答案 https stackoverflow com a 36530534 11236 我正在尝试设置Vue config delimiters 为了使用Vue与服务器端handlebars 当我只使用全局配置时 它没有任
  • 如何减小 openlayers 3 中图标的大小,我正在使用 bing 地图

    这是我的代码 var iconFeature new ol Feature geometry new ol geom Point ol proj transform 95 3698 29 7604 EPSG 4326 EPSG 3857 n
  • 计算行中最后一个单元格和下一个非空白单元格之间的空白单元格数量

    是否可以 最好使用公式 计算行中空白单元格的数量 其中计数从给定列开始并向后计数 例如从右到左 空白单元格的数量 直到找到非空白单元格 在下面的示例中 计数从 H 列开始并向左进行 使用COUNTA or COUNTIF似乎是合理的工具 但
  • Passport Laravel Rest API Auth 与正常设计

    I have Completely assigned the Passport REST API and i get token and tested on PostMan 并使用此 Auth 检索数据 这是带有 laravel Blade
  • Java Scanner 类读取字符串

    我得到以下代码 int nnames String names System out print How many names are you going to save Scanner in new Scanner System in n
  • 读取巨大的 .csv 文件

    我目前正在尝试从 Python 2 7 中的 csv 文件读取最多 100 万行和 200 列的数据 文件范围从 100mb 到 1 6gb 我可以对 300 000 行以下的文件执行此操作 非常缓慢 但是一旦超过该行数 就会出现内存错误
  • 如何更新 Git 克隆

    我已经开始使用 Git 我已在本地系统上克隆了该存储库 我在本地计算机上进行更改并使用git push更新远程仓库 效果很好 我有一个快速查询如何从远程更新我的克隆 我试过git remote update 它不起作用 没有出现新的变化 我
  • 为 iOS 应用程序提交开放图操作?

    对于 App Store 中尚不存在的 iOS 应用程序 当我提交 Facebook Open Graph Api 的操作时 我应该为 重现操作的步骤 编写什么 当您拥有这样的本机移动应用程序时 您可以提交应用程序流程的屏幕截图作为可接受的
  • 将文件读取为元组列表

    我想使用 Python 读取文本文件 我的清单必须是这样的 mylist 34 968398 6 487265 34 969448 6 488250 34 967364 6 492370 34 965735 6 582322 我的文本文件是
  • 动态选中/取消选中树中的复选框

    我有一个类似的问题如果在 JQuery 中未选中所有子节点 则取消选中父节点 https stackoverflow com questions 6556446 uncheck parent node if all children unc
  • 写入 Visual Studio 的输出窗口

    我正在尝试向输出窗口写入一条消息以进行调试 我搜索了一个类似Java的函数system out println 我试过Debug Write Console Write and Trace Write 它不会给出错误 但也不会打印任何内容
  • devise 和 Rails 3 中的 http 身份验证

    我有一个使用 devise on Rails 3 的应用程序 我想启用 http 身份验证 以便我可以从 iPhone 应用程序对我的 Web 应用程序进行身份验证 如何通过我的 iPhone 应用程序进行身份验证以进行设计 这是安全的还是
  • 升级.net紧凑框架版本后出现异常

    我已通过 Visual Studio 将项目从 NET 2 0 升级到 NET 3 5Project gt Upgrade Project 升级后 当我编译项目时 出现错误 The type System Windows Forms Dat
  • Undertow 中的图像/媒体 MIME 类型响应

    我一直在努力寻找一种在 Undertow 中传递 jpeg png 或其他内容的方法 发送 byte 不起作用 并且由于 Undertow 是非阻塞的 我不想通过执行通常的操作在输出上写入文件 exchange getOutputStrea
  • Spring Data JPA - JpaRepository 中的自定义排序

    我正在将 Spring Data JPA 与 Spring Data REST 一起使用 并且我已经为我的 JpaRepository 创建了一个 JpaRepositoryThing entity Repository public in