How to use projection interfaces with pagination in Spring Data JPA?

后端 未结 6 2132
-上瘾入骨i
-上瘾入骨i 2021-02-19 10:50

I\'m trying to get a page of a partial entity (NetworkSimple) using the new feature of spring data, projections

I\'ve checked the documentation and if I request only:

相关标签:
6条回答
  • 2021-02-19 11:18

    I think you need create findAllProjectedBy() as specification.Then you can use findAll() method like this.

    example :findAll(findAllProjectedBy(),pageable)

    Following link may be help to find how to create specification in spring.

    https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

    0 讨论(0)
  • 2021-02-19 11:25

    Note: This feature should work in the way described by the original poster but due to this bug it didn't. The bug has been fixed for the Hopper SR2 release, if you're stuck on an earlier version then the workaround below will work.

    It is possible to use Pageable with the new query projection features introduced in Spring Data JPA 1.10 (Hopper). You will need to use the @Query annotation and manually write a query for the fields you require, they must also be aliased using AS to allow Spring Data to figure out how to project the results. There is a good example in spring-boot-samples part of the spring boot repository.

    In your example it would be quite simple:

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

    I have made the assumption that your entity looks something like this:

    @Entity
    public class Network
    {
        @Id
        @GeneratedValue
        private Long id;
    
        @Column
        private String name;
    
        @Column
        private boolean active;
    
        ...
    }
    

    Spring Data will derive a count query automatically for the paging information. It is also possible to make use of joins in the query to fetch associations and then summarise them in the projection.

    0 讨论(0)
  • 2021-02-19 11:32

    You can use interface projection with Pageable like this :

    Page<NetworkSimple> findPagedProjectedBy(Pageable pageable);
    

    with some parameter :

    Page<NetworkSimple> findPagedProjectedByName(String name, Pageable pageable);
    
    0 讨论(0)
  • 2021-02-19 11:32

    You can use:

    @Query("SELECT n FROM Network n")
    Page<? extends NetworkSimple> findAllProjectedBy(Pageable pageable);
    
    0 讨论(0)
  • 2021-02-19 11:35

    The issue may come from the method name. The by keyword means that you ae filterig data by a specific property: findByName for example. Its called query creation from method name:

    http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-methods.query-creation

    So try with Page<NetworkSimple> findAll(Pageable pageable);

    0 讨论(0)
  • 2021-02-19 11:42

    Even with spring-data-jpa 1.11.4, something like

    public interface NetworkRepository extends JpaRepository<Network, String> {
        Page<NetworkSimple> findAll(Pageable pageable);
    }
    

    would not compile; reporting

    findAll(org.springframework.data.domain.Pageable) in NetworkRepository clashes with findAll(org.springframework.data.domain.Pageable) in org.springframework.data.repository.PagingAndSortingRepository
    return type org.springframework.data.domain.Page<NetworkSimple> is not compatible with org.springframework.data.domain.Page<Network>
    

    The workaround we found was to rename findAll to findAllBy, e.g.

    public interface NetworkRepository extends JpaRepository<Network, String> {
        Page<NetworkSimple> findAllBy(Pageable pageable);
    }
    
    0 讨论(0)
提交回复
热议问题