使用pageable对自定义JPA查询进行排序

时间:2017-01-03 00:53:42

标签: spring sorting pagination spring-data spring-data-jpa

所以,我已经使用标准的Spring Data JPA接口完成了这项工作,该接口扩展了PagingAndSortingRepository以实现REST API的分页和排序。问题是,现在我想实现完全相同的东西,但现在只使用vanilla 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对象,从控制台我可以说它实际上是在获取数据,所以我认为问题在于repo。

编辑:这是我为一个硬编码字符串(即query.setParameter(“sort”,“name”)替换setParameter(“sort”,...)时得到的错误:

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

我认为这种方法也应该代表字符串。如果我使用query.setParameter(“sort”,pageable.getSort()),则错误是相同的。

1 个答案:

答案 0 :(得分:4)

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