Spring Pageable NamedNativeQuery

Posted

技术标签:

【中文标题】Spring Pageable NamedNativeQuery【英文标题】: 【发布时间】:2020-12-22 00:22:59 【问题描述】:

我遇到了一个问题,很难找到好的示例或此类问题的参考。我正在尝试将分页添加到我已经存在的 NamedNativeQuery。据我了解,您需要提供另一个 NamedNativeQuery 用于在名称末尾添加 .count 的分页。

我当前的查询看起来像这样:

@NamedNativeQuery(
    name="Foo.getObj",
    resultSetMapping="obj",
    query="SELECT item1, item2, item3, ... 
        FROM Table1 t1 Join Table2 t2 On t1.id = t2.id ...
        WHERE t1.num = :num" 
)

这是我尝试的分页查询:

@NamedNativeQuery(
    name="Foo.getObj.count",
    resultSetMapping="obj",
    query="SELECT COUNT(item1, item2, item3, ...) 
        FROM Table1 t1 Join Table2 t2 On t1.id = t2.id ...
        WHERE t1.num = :num" 
)

我的来电者是这样的:

@Query(nativeQuery=true)
public List<Foo>retrieveFoo(ServiceRequest req)
    return repo.retrieveFoo(@Param("num") foo.getNum(), PageRequest.of(0, req.pages)); //req.pages is never less than 1

我对 Spring、JPA 和 Hibernate 还很陌生,但我仅限于以这种方式实现它,或者在某种程度上类似于这种方式。 我可以使用新的 Pageable(0, 1) 来测试它。但任何大于 1 的数量都会引发此异常: org.springframework.orm.jpa.JpaSystemException "无法调用类 service.sources.Foo 构造函数;嵌套异常是 org.HibernateException: 无法调用类 service.sources.Foo 构造函数"

任何处理分页 NamedNativeQueries 或文档的技巧都会有所帮助,我似乎找不到很多使用此类查询进行分页的示例。

【问题讨论】:

【参考方案1】:

结果证明这种调用可分页@NamedNativeQuery 的方式是正确的。从数据库返回的参数之一是 null,并且在应该分配给它的类变体时被分配给原语。因此,我没有将其分配给 Integer 类型,而是将其分配给 int 类型。这导致它无法为我的查询找到合适的构造函数。碰巧我在这种情况下尝试的 num 具有该参数的 null 变量,而其他 nums 没有。修复用类变体替换原语后,一切正常。

【讨论】:

以上是关于Spring Pageable NamedNativeQuery的主要内容,如果未能解决你的问题,请参考以下文章

Spring 数据 JpaRepository 方法问题中的 Pageable 和 @Param [2]

如何使用 Repository Hibernate 和 Pageable 与 Java Spring 进行参数搜索?

Spring Boot:以 Pageable 作为请求参数的 @GetMapping 无法按预期工作

Spring Boot,MongoDB,Pageable,按对象中的自定义方法排序

Spring Pageable NamedNativeQuery

如何使用带有 Pageable 的 Spring Data JPA 分页来更改数据?