我正在尝试在基于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);
一切正常。但是,现在我想按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();
}
不幸的是,我无法使用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);
抛出以下异常:
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property CHAR found for type MyEntity!
最佳答案
它在查询中起作用的原因是Hibernate将无法识别的任何内容直接传递到SQL中,它不是JPA功能,因此它可能无法与其他提供程序一起使用。
一个不错的选择是实现自定义Order
类,并改用它。您可以在this blog中找到详细说明。有了与博客中相同的实现,您可以将其用作OrderBySqlFormula.sqlFormula("CHAR_LENGTH(name) desc")
更新
提出的解决方案仅适用于Hibernate,不能与Spring Data代码一起使用,Spring Data代码需要org.springframework.data.domain.Sort.Order
而不是org.hibernate.criterion.Order
。