Spring Data - 页面请求 - 按功能排序

Kon*_*rad 5 java sql spring hibernate jpa

我试图在基于 Spring 4.1.1.RELEASE 和 Hibernate 4.2.16.Final 的 Java 应用程序中实现分页。

我有以下代码:

PageRequest pageRequest = new PageRequest(pageNumber, pageSize, new Sort(new Order(Direction.DESC, "name"))
Page page = myRepository.findAll(specification, pageRequest);
Run Code Online (Sandbox Code Playgroud)

一切正常。但是现在我想按 sql 函数值排序,例如:ORDER BY CHAR_LENGTH(name)

当我在 中输入这样的子句时,它完美地工作@org.springframework.data.jpa.repository.Query,例如:

public class MyRepository {
  @Query("select e from MyEntity e order by CHAR_LENGTH(e.name)")
  public List<MyEntity> findAllOrderedByNameLength();
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我无法使用 PageRequest 来做到这一点。当我将:ORDER BY CHAR_LENGTH(name)作为属性传递给 PageRequest 时:

PageRequest pageRequest = new PageRequest(pageNumber, pageSize, new Sort(new Order(Direction.DESC, "ORDER BY CHAR_LENGTH(name)"))
Page page = myRepository.findAll(specification, pageRequest);
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property CHAR found for type MyEntity!
Run Code Online (Sandbox Code Playgroud)

Pre*_*ric 2

它在查询中工作的原因是 Hibernate 将它无法识别的任何内容直接传递到 SQL 中,它不是 JPA 功能,因此它可能无法与其他提供程序一起工作。

一个不错的选择是实现一个自定义Order类,然后使用它。您可以在此博客中找到详细说明。通过博客中的确切实现,您可以将其用作OrderBySqlFormula.sqlFormula("CHAR_LENGTH(name) desc")

更新

建议的解决方案仅适用于 Hibernate,不能与 Spring Data 代码一起使用,Spring Data 代码需要org.springframework.data.domain.Sort.Order而不是org.hibernate.criterion.Order.