我正在尝试使用 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/