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

问题描述 投票:0回答:2

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

这是一些代码:

我的回购实施:

    @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 对象,并且从控制台我可以说它实际上正在获取数据,所以我认为问题出在存储库上。

编辑:这是当我将 setParameter("sort", ...) 替换为硬编码字符串(又名 query.setParameter("sort", "name"))时遇到的错误:

java.lang.NumberFormatException: For input string: "name"

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

spring sorting pagination spring-data spring-data-jpa
2个回答
7
投票

order by 不能设置为查询参数。 此外,Pageable.getSort().toString() 可能不会返回适合在 order by 子句中使用的字符串,因为它将生成一个将 Order 表示为 property: 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));

0
投票

Spring Data Jpa 通过 QueryUtils.applySorting 方法直接支持此功能。

queryString = QueryUtils.applySorting(queryString, pageable.getSort());
© www.soinside.com 2019 - 2024. All rights reserved.