春季数据 - 页面请求 - 按功能排序 [英] Spring Data - Page Request - order by function
问题描述
我试图在基于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元素MyRepository {
@Query(从MyEntity e选择e由CHAR_LENGTH(e.name))
public List< MyEntity> findAllOrderedByNameLength();
}
不幸的是,我无法使用PageRequest完成它。 code> ORDER BY CHAR_LENGTH(
PageRequest pageRequest = new PageRequest(pageNumber,pageSize,new) Sort(new Order(Direction.DESC,ORDER BY CHAR_LENGTH(name)))
Page page = myRepository.findAll(specification,pageRequest);
引发以下异常:
原因:org.springframework.data.mapping.PropertyReferenceException:找不到属性类型为MyEntity的CHAR!
它不直接识别SQL,它不是JPA功能,因此它可能不适用于其他提供程序。
一个不错的选择是实现一个自定义的 Order
类,并使用它。您可以在这个博客。按照博客中的具体实现,您可以使用它作为 OrderBySqlFormula.sqlFormula(CHAR_LENGTH(name)desc)
UPDATE
建议的解决方案仅适用于Hibernate,不能用于Spring Data代码,该代码需要 org.springframework.data.domain.Sort.Order
而不是 org.hibernate.criterion.Order
。
I am trying to implement pagination in Java application based on Spring 4.1.1.RELEASE and Hibernate 4.2.16.Final.
I have a following code:
PageRequest pageRequest = new PageRequest(pageNumber, pageSize, new Sort(new Order(Direction.DESC, "name"))
Page page = myRepository.findAll(specification, pageRequest);
and everything works fine. However now I would like to order by sql function value, for example: ORDER BY CHAR_LENGTH(name)
.
It works perfectly when I input such clause in @org.springframework.data.jpa.repository.Query
, for example:
public class MyRepository {
@Query("select e from MyEntity e order by CHAR_LENGTH(e.name)")
public List<MyEntity> findAllOrderedByNameLength();
}
unfortunately I am not able to do it with PageRequest. When I pass: ORDER BY CHAR_LENGTH(name)
to PageRequest as a property:
PageRequest pageRequest = new PageRequest(pageNumber, pageSize, new Sort(new Order(Direction.DESC, "ORDER BY CHAR_LENGTH(name)"))
Page page = myRepository.findAll(specification, pageRequest);
the following exception is being thrown:
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property CHAR found for type MyEntity!
The reason it works in query is that Hibernate passes whatever it doesn't recognize directly into SQL, it isn't a JPA feature so it probably wouldn't work with some other provider.
One nice option is to implement a custom Order
class, and use that instead. You can find detailed instructions in this blog. With the exact implementation as in the blog, you would use it as OrderBySqlFormula.sqlFormula("CHAR_LENGTH(name) desc")
UPDATE
The proposed solution is for Hibernate only, can't be used with Spring Data code, which expects org.springframework.data.domain.Sort.Order
and not org.hibernate.criterion.Order
.
这篇关于春季数据 - 页面请求 - 按功能排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!