当前位置: 首页 > 知识库问答 >
问题:

spring数据jpa可分页排序错误

端木阳荣
2023-03-14

我使用了spring boot(1.3.5)、spring-data、spring-data-jpa、JPA(hibernate/hsqldb)。

代码:

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>

<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
@Bean
public PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver(
        SortHandlerMethodArgumentResolver sortHandlerMethodArgumentResolver) {

    PageableHandlerMethodArgumentResolver phmar = new PageableHandlerMethodArgumentResolver(
            sortHandlerMethodArgumentResolver);
    phmar.setOneIndexedParameters(false);
    phmar.setPageParameterName("page");
    phmar.setSizeParameterName("size");
    phmar.setMaxPageSize(20);
    return phmar;
}

@Bean
public SortHandlerMethodArgumentResolver sortHandlerMethodArgumentResolver() {

    SortHandlerMethodArgumentResolver shmar = new SortHandlerMethodArgumentResolver();
    shmar.setSortParameter("sort");
    return shmar;
}

控制器:

@RequestMapping(value = { "/List", "" })
public String list(Model model, @RequestParam(required = false) String searchString,
        @SortDefault(sort = "code", direction = Direction.ASC) @PageableDefault(page = 0, size = 20) Pageable pageable) {

我试着

@PageableDefault(page = 0, size = 20, sort = "code", direction = Direction.ASC)

也是,但不起作用。

Page<T> page;
if (!isEmpty(searchString))
   page = service.search(searchString, pageable); // <-- ERROR
else
   page = service.findAll(pageable);  // <-- OK
@Override
@Transactional(readOnly = true)
public Page<T> search(String str, Pageable pageable) {
    return repository.search(str, pageable);
}
@Repository
public interface EntityRepository extends JpaRepository<T, Integer> {
(...)
@Query(value = "SELECT a FROM #{#entityName} a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%'))")
Page<T> search(@Param("str") String str, Pageable pageable);
@Query(value = "SELECT a FROM #{#entityName} a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%'))")
List<T> search(@Param("str") String str);

浏览器输出:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed May 25 15:16:24 CEST 2016
There was an unexpected error (type=Internal Server Error, status=500).
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: : near line 1, column 151 [SELECT a FROM prueba.entity.AccountType a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: : near line 1, column 151 [SELECT a FROM prueba.entity.AccountType a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]

SQL无效!额外的“:”和重复的“ASC ASC”。

控制台输出:

Hibernate: 
    select
        count(accounttyp0_.id) as col_0_0_ 
    from
        account_type accounttyp0_ 
    where
        accounttyp0_.code like ('%'||?||'%') 
        or upper(accounttyp0_.name) like upper(('%'||?||'%'))
mo.h.hql.internal.ast.ErrorCounter       line 1:151: unexpected token:     :
mo.h.hql.internal.ast.ErrorCounter       line 1:151: unexpected token:     :

antlr.NoViableAltException: unexpected token: :
    at         org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3694)     [hibernate-core-4.3.11.Final.jar:4.3.11.Final]

(more and more)

near line 1, column 151 [SELECT a FROM prueba.entity.AccountType a     WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE     UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]; nested exception     is java.lang.IllegalArgumentException:     org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: :     near line 1, column 151 [SELECT a FROM prueba.entity.AccountType a WHERE     a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE     UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]] with root cause

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token:     : near line 1, column 151 [SELECT a FROM     prueba.entity.AccountType a WHERE a.code LIKE CONCAT('%', :str, '%') OR     UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]
    at     org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxExcept    ion.java:91) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]

共有1个答案

阎善
2023-03-14

对于使用spring-data-jpa进行分页,您必须实现PagingAndSortingRepository接口。

您必须编写一个方法,它将参数作为Pageable page as并且可以将new PageRequest(0,size)作为参数传递给Pageable,而size是您想要获取的记录数。

不要使用@query,而是可以编写简单的方法,并且可以在spring-data-jpa中使用所有支持的关键字。

http://docs.spring.io/spring-data/jpa/docs/1.4.3.release/reference/html/jpa.repositories.html

 类似资料:
  • 我试图指定一个用注释的存储库方法和一个带有对象的Pagable: 编辑1:此存储库正在扩展分页和排序存储库。 对象使用以下方法签名指定: 但生成的输出查询没有排序选项,例如: ...在我期待的时候: 这里有人遇到过这样的问题吗?我使用的是Spring Boot 1.5。x。

  • 我在Spring数据(JPA Hibernate MySQL)应用程序中使用NamedNativeQueries和SqlResultSetMappings,我已经成功地完成了分页,但没有完成排序。 我尝试了两种形式的查询: 第二种方法是在第二个查询中简单地使用计数符号,而不是使用#页面符号。 这两种方法都适用于分页,但忽略了排序。 这是存储库: 可分页页面的组装方式如下: 没有抛出错误,但排序没有

  • 我有一个简单的JpaRepository和一个finder,它返回按名为“number”的属性降序排列的记录。“number”属性也是我的实体的@Id。这很好,但是有数千条记录,所以我想返回一个页面而不是列表。 如果我将查找器更改为以下内容,则排序不再起作用。我尝试过使用可分页参数的排序功能,但不起作用。还删除了OrderByNumberDesc,但结果相同。 EDIT-添加控制器方法 以下是我的

  • 问题内容: 我正在使用Spring Data JPA,当我用来定义一个 WITHOUT 的查询时,它可以工作: 但是,如果我添加第二个参数,则将无法正常工作,Spring将解析该方法的名称,然后抛出 异常 。这是错误吗? 问题答案: 在Spring论坛上提出了一个类似的问题,指出要应用分页,必须派生第二个子查询。因为子查询引用的是相同的字段,所以您需要确保查询对引用的实体/表使用别名。这意味着您在

  • 我有一个spring boot项目,我使用spring JPA。我有一个模型,它有一个列,它的数据库列名是。我调用<code>findAll(谓词谓词,Pageable-Pageable) 当我在ReceiptService中使用创建谓词并使用传递它时,它完全正常工作,但当我添加排序时,它会抛出以下异常:

  • 本文向大家介绍Spring Data JPA进行数据分页与排序的方法,包括了Spring Data JPA进行数据分页与排序的方法的使用技巧和注意事项,需要的朋友参考一下 一、导读 如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好。所以处理较大数据查询结果展现的时候,分页查询是必不可少的。分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控制,导致用户可能在不同的页看