spring之使用可分页对自定义 JPA 查询进行排序

zhwl 阅读:19 2025-06-02 22:19:02 评论:0

因此,我已经使用标准 Spring Data JPA 接口(interface)完成了这项工作,该接口(interface)扩展了 PagingAndSortingRepository 以实现 REST API 的分页和排序。问题是,现在我想实现同样的目标,但现在只使用 Vanilla JPA,到目前为止,我设法让我的 API 进行分页,但排序根本不起作用。每次我尝试设置参数(从使用 pageable.getSort() 的可分页对象)时,它都会以查询错误结束(如果我只是发送一个字符串作为参数,如“名称”,或者只是发送排序对象,它会显示错误)。

这是一些代码:

我的 repo 实现:

    @Override 
public List<Project> findByAll(Pageable pageable) { 
    Query query = em.createQuery("SELECT project FROM Project project ORDER BY :sort"); 
    query.setParameter("sort", pageable.getSort()); 
    query.setMaxResults(pageable.getPageSize()); 
    query.setFirstResult(pageable.getPageSize() * pageable.getPageNumber()); 
    return query.getResultList(); 
} 

我的服务:
@Override 
public Page<Project> findAll(Pageable pageable) { 
    objects = Lists.newArrayList(repository.findByAll(pageable)); 
    PageImpl<Project> pages= new PageImpl<Project>(objects, pageable, repository.count()); 
    return pages; 
} 

需要明确的是,我通过 URI 填充 Pageable 对象,从控制台我可以说它实际上是在获取数据,所以我认为问题出在 repo 上。

编辑:这是我将 setParameter("sort", ...) 替换为硬编码字符串 aka query.setParameter("sort", "name") 时遇到的错误:
java.lang.NumberFormatException: For input string: "name" 

而且我认为这种方法也应该代表字符串。如果我使用 query.setParameter("sort", pageable.getSort()),错误是一样的。

请您参考如下方法:

order by 不能设置为查询参数。此外,Pageable.getSort().toString() 可能不会返回适合在 order by 子句中使用的字符串,因为它将导致将 Order 表示为属性的字符串:ORDER,请注意冒号。

以下是一些可行的修改,假设 Java 8...

String order = StringUtils.collectionToCommaDelimitedString( 
   StreamSupport.stream(sort.spliterator(), false) 
      .map(o -> o.getProperty() + " " + o.getDirection()) 
      .collect(Collectors.toList())); 
 
Query query = em.createQuery( 
   String.format("SELECT project FROM Project project ORDER BY %s", order)); 


标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号