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

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

拓拔霄
2023-03-14

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

    @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填充可分页对象,从控制台我可以说它实际上是在获取数据,所以我假设问题出在repo上。

Edit:这是当我替换硬编码字符串query的setParameter(“sort”,...)时得到的错误。setParameter(“sort”,“name”):

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

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

共有1个答案

毛宏达
2023-03-14

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

下面是一些可以工作的修改,假设Java8...

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));
 类似资料:
  • 问题内容: 我有一个页面,它执行一个自定义查询,该查询已保存在数据库中的某个位置。我需要能够在gridview上启用分页。 例如,查询保存在数据库中的方式如下: 这将返回10,000行。 使用下面的方法,我使它返回10行。 这是绑定网格的代码 问题在于查询本身返回10行,因此gridview将永远不会显示寻呼机。 问题答案: 此代码在aspx页面 在此,将在.cs页中使用的方法。该方法用于跟踪pa

  • 上一页下一页都是第一页的内容

  • 我得到一个错误-“错误:找不到适合排序(ArrayList)的方法。我如何修复这个问题? 多谢了。

  • 我想使用@Query批注从具有@OneTo许多关系的实体创建左连接查询。 母公司是: 孩子: 对于DAO,我确实喜欢以下内容: 显然,它是错误的,因为生成的查询是: 选择payment1。uuid为uuid1_9_,付款1_。注册时内部加入付款1的注册金额。uuid=payment1_uid。uuid在哪里注册。效果=? 在生成关系表时: 对我来说,正确的查询应该是这样的: 选择p.*从注册r加入

  • 我在这里创建了一个类似于教程的Web应用程序:https://spring.io/guides/tutorials/react-and-spring-data-rest/ . 我已经添加了后gresql数据库,一切正常。我有一个基本查询查找我的存储库中的By用户名(字符串名称),工作正常。我的问题是,由于某种原因我无法创建自定义查询,例如 . 假设我做了一个测试,我只想得到这个语句的值。我说的不能

  • 根据要求,这里有一个简单的示例: https://github.com/caiquebispoferreira/springdatajpa https://github.com/gtiwari333/hibernate-inherity-joined-with-where-bug(更简单的示例)