如何在Spring Data JPA中使用具有分页功能的投影接口?

Dav*_*ães 13 spring hibernate jpa spring-data spring-data-jpa

我正在尝试使用弹簧数据的新功能,投影来获取部分实体(NetworkSimple)的页面

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

Collection<NetworkSimple> findAllProjectedBy();
Run Code Online (Sandbox Code Playgroud)

它有效,但如果我使用可分页:

Page<NetworkSimple> findAllProjectedBy(Pageable pageable);
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误:

org.hibernate.jpa.criteria.expression.function.AggregationFunction$COUNT cannot be cast to org.hibernate.jpa.criteria.expression.CompoundSelectionImpl
Run Code Online (Sandbox Code Playgroud)

任何人已经使用过这个吗?

我的NetworkSimple类如下:

public interface NetworkSimple {
    Long getId();

    String getNetworkName();

    Boolean getIsActive();
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*unt 13

注意:此功能应该以原始海报描述的方式工作,但由于此错误,它没有.该漏洞已针对Hopper SR2版本修复,如果您遇到早期版本,则下面的解决方法将起作用.

可以使用PageableSpring Data JPA 1.10(Hopper)中引入的新查询投影功能.您将需要使用@Query注释和手动写你需要,他们也必须使用的别名的字段的查询AS,让春天的数据弄清楚如何对项目的结果.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);
Run Code Online (Sandbox Code Playgroud)

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

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

    @Column
    private String name;

    @Column
    private boolean active;

    ...
}
Run Code Online (Sandbox Code Playgroud)

Spring Data将自动为寻呼信息导出计数查询.也可以在查询中使用连接来获取关联,然后在投影中对它们进行汇总.