使用pageable排序自定义JPA查询

Man*_*áez 3 sorting spring pagination spring-data spring-data-jpa

因此,我已经使用标准的Spring Data JPA接口(扩展了PagingAndSortingRepository)来实现此目的,以便实现REST API的分页和排序。问题是,现在我想实现同样的目的,但是现在仅使用原始的JPA,到目前为止,我设法使我的API分页,但排序根本不起作用。每当我尝试设置参数(使用pageable.getSort()从可分页对象中设置)时,它都会以查询错误结尾(如果我只是将字符串作为参数(如“名称”)发送或仅发送了排序对象,它就会显示错误)。

这是一些代码:

我的回购实现:

    @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();
}
Run Code Online (Sandbox Code Playgroud)

我的服务:

@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;
}
Run Code Online (Sandbox Code Playgroud)

需要明确的是,我正在通过URI填充Pageable对象,并且可以从控制台中说它实际上是在获取数据,因此我认为问题出在存储库上。

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

java.lang.NumberFormatException: For input string: "name"
Run Code Online (Sandbox Code Playgroud)

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

lan*_*ell 5

不能将order by设置为查询参数。同样,Pageable.getSort()。toString()可能不会返回适合在order by子句中使用的字符串,因为它会导致将String表示为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));
Run Code Online (Sandbox Code Playgroud)