春季数据 - 页面请求 - 按功能排序 [英] Spring Data - Page Request - order by function

查看:86
本文介绍了春季数据 - 页面请求 - 按功能排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在基于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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆