spring - 如何在 Spring Data JPA 中使用带有分页的投影接口(interface)?

标签 spring hibernate jpa spring-data spring-data-jpa

我正在尝试使用 spring 数据的新功能 projections 获取部分实体 (NetworkSimple) 的页面

我已经检查了文档,如果我只要求:

Collection<NetworkSimple> findAllProjectedBy();

它可以工作,但如果我使用的是可分页的:

Page<NetworkSimple> findAllProjectedBy(Pageable pageable);

它会抛出一个错误:

org.hibernate.jpa.criteria.expression.function.AggregationFunction$COUNT cannot be cast to org.hibernate.jpa.criteria.expression.CompoundSelectionImpl

有人已经用过这个了吗?

我的 NetworkSimple 类如下:

public interface NetworkSimple {
    Long getId();

    String getNetworkName();

    Boolean getIsActive();
}

最佳答案

注意:此功能应该按照原始海报描述的方式工作,但由于 this bug它没有。该错误已针对 Hopper SR2 版本进行了修复,如果您卡在较早的版本上,则下面的解决方法将起作用。

可以将 Pageable 与 Spring Data JPA 1.10 (Hopper) 中引入的新查询投影功能一起使用。您将需要使用 @Query 注释并为您需要的字段手动编写查询,它们还必须使用 AS 别名以允许 Spring Data 弄清楚如何投影结果。 spring-boot-samples 中有一个很好的例子Spring Boot 存储库的一部分。

在你的例子中它会很简单:

@Query("SELECT n.id AS id, n.name AS networkName, n.active AS isActive FROM Network n")
Page<NetworkSimple> findAllProjectedBy(Pageable pageable);

我假设您的实体看起来像这样:

@Entity
public class Network
{
    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String name;

    @Column
    private boolean active;

    ...
}

Spring Data 将自动为分页信息派生一个计数查询。也可以在查询中使用连接来获取关联,然后在投影中汇总它们。

关于spring - 如何在 Spring Data JPA 中使用带有分页的投影接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36701358/

相关文章:

spring - 无法让 Elasticsearch 插件与 Grails 3 一起使用

spring-boot - "JdbcSQLIntegrityConstraintViolationException: Unique index or primary key violation"升级到Spring Boot 2.7后出现异常

hibernate - 外键的列数错误

java - 对于大于 150kb 的文件上传请求参数为 null,多部分文件上传,Spring 3.2,wildfly 9.0.0

java - Spring MVC 重定向页面

java - 初始化多个配置文件时出错

java - 如何在 Spring Controller 中获取与 JPA 和 Hibernate 的 FetchType.LAZY 关联

java - 为什么 JPA TypedQuery 抛出异常 : Parameter value [. ..] 与预期类型 [java.lang.Character] 不匹配?

java - 加入 Spring 框架的验证和消息

java - 如何手动处理Spring 4事务?