Java Spring数据-页面请求-按功能排序

Java Spring数据-页面请求-按功能排序,java,sql,spring,hibernate,jpa,Java,Sql,Spring,Hibernate,Jpa,我试图在基于Spring4.1.1.RELEASE和Hibernate4.2.16.Final的Java应用程序中实现分页 我有以下代码: PageRequest pageRequest = new PageRequest(pageNumber, pageSize, new Sort(new Order(Direction.DESC, "name")) Page page = myRepository.findAll(specification, pageRequest); 一切正常。但是现在

我试图在基于Spring4.1.1.RELEASE和Hibernate4.2.16.Final的Java应用程序中实现分页

我有以下代码:

PageRequest pageRequest = new PageRequest(pageNumber, pageSize, new Sort(new Order(Direction.DESC, "name"))
Page page = myRepository.findAll(specification, pageRequest);
一切正常。但是现在我想按sql函数值排序,例如:
orderbychar\u 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();
}
正在引发以下异常:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property CHAR found for type MyEntity!

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

一个很好的选择是实现一个定制的
Order
类,并改用它。您可以在中找到详细说明。使用博客中的具体实现,您可以将其用作
OrderBySqlFormula.sqlFormula(“CHAR_LENGTH(name)desc”)

更新


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

,您可以使用@Formula为字符长度(名称)表达式定义一个自定义字段并使用它进行排序


例如,请参见

OK,但它需要我没有引用的“Criteria”对象。在我的代码中,只有“Specification”和“PageRequest”被传递到存储库,它工作得非常好,因为它返回我需要返回给客户端的“Page”对象(它包含元素总数和页面总数)。在您的示例中,我需要从头开始实现这样的逻辑—首先计数,然后选择并将所有内容设置为Page object。如果您引用的是方法
toSqlString()
,它在
org.hibernate.criteria.Order
中声明并在内部使用。您可以像这样使用它
new PageRequest(pageNumber、pageSize、new Sort(OrderBySqlFormula.sqlFormula(“CHAR_LENGTH(name)desc”))
OK,但问题是我需要将
org.springframework.data.domain.Pageable
传递到我的存储库,它需要
org.springframework.data.domain.Sort
,我无法构建它,因为我没有
org.springframework.data.domain.Sort.Order
。我只有
org.hibernate.criteria.Order
,这是不兼容的。哦,你说得对。很抱歉我看到了
hibernate
标签,完全忘记了这是一个spring数据问题。听起来很有趣。但是,是否可以在需要时动态创建此类公式?问题是排序属性的名称(在本例中为“名称”)来自客户机。我需要做的唯一一件事就是用函数调用包装这个属性名并传递给存储库。有多个实体和多个可能的排序列,因此维护每个实体的formula属性可能会有问题。此外,Hibernate中有一个bug,在实体中使用@formula已经有10年了。它可能不会出现在您正在使用它的用例中,但在您尝试转换为该实体的其他本机查询中,您会遇到错误。在db中创建视图不是更容易吗?
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property CHAR found for type MyEntity!