복붙노트

[SPRING] Spring 데이터 Neo4j 4에서 페이징 및 정렬

SPRING

Spring 데이터 Neo4j 4에서 페이징 및 정렬

SDN4의 맞춤 검색어에 대한 페이지 매김 지원이 있습니까?

다음 Spring Data Neo4j 4 저장소가 있습니다.

@Repository
public interface TopicRepository 
  extends GraphRepository<Topic>,IAuthorityLookup {

  // other methods omitted
  @Query("MATCH (t:Topic)-[:HAS_OFFICER]->(u:User) "
    + "WHERE t.id = {0} "
    + "RETURN  u")
  public Page<User> topicOfficers(Long topicId, Pageable pageable);
}

그리고 해당하는 테스트 케이스 :

@Test
public void itShouldReturnAllOfficersAsAPage() {
  Pageable pageable = new PageRequest(1,10);
  Page<User> officers = topicRepository.topicOfficers(1L, pageable);
  assertNotNull(officers);
}

테스트를 실행하면 다음과 같은 예외가 발생합니다.

Failed to convert from type java.util.ArrayList<?> to type   org.springframework.data.domain.Page<?> for value '[org.lecture.model.User@1]'; 
nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type java.util.ArrayList<?> to type org.springframework.data.domain.Page<?>

이것은 내 설정입니다.

dependencies {
//other dependencies omitted
  compile("org.neo4j:neo4j-cypher-dsl:2.0.1")


  compile "org.neo4j.app:neo4j-server:2.2.2"

  compile(group: 'org.springframework.data',
          name: 'spring-data-neo4j',
          version: '4.0.0.BUILD-SNAPSHOT')


  compile(group: 'org.springframework.data',
          name: 'spring-data-neo4j',
          version: '4.0.0.BUILD-SNAPSHOT',
          classifier: 'tests')

  testCompile(group: 'org.neo4j',
          name: 'neo4j-kernel',
          version: '2.2.2',
          classifier: 'tests')

  testCompile(group: 'org.neo4j.app',
              name: 'neo4j-server',
              version: '2.2.2',
              classifier: 'tests')

  testCompile(group: 'org.neo4j',
              name: 'neo4j-io',
              version: '2.2.2',
              classifier: 'tests')
} 

다음 테스트가 잘 실행되므로 스냅 샷에서 페이지 매김을 처리 할 수 ​​있어야합니다.

@Test
public void itShouldReturnAllTopicsAsAPage() {

  Pageable pageable = new PageRequest(1,10);
  Page<Topic> topics = topicRepository.findAll(pageable);

  assertNotNull(topics);
}

해결법

  1. ==============================

    1.현재로서는 이것이 불가능합니다.

    현재로서는 이것이 불가능합니다.

    이 기능을 사용하려면 몇 가지 작업을 수행해야합니다. 처음 시작할 때 쿼리의 연관된 메서드 서명을 검사하고 쿼리가 페이징을 요구하는 것으로 표시해야합니다. 그런 다음 런타임에 메소드가 호출 될 때 페이지 가능 인스턴스를 얻고 페이지 매개 변수를 추출하여 SKIP 및 LIMIT 절로 관련 Cypher 쿼리에 적용해야합니다. 마지막으로 반환 할 때 결과를 Page 객체로 래핑해야합니다. 그래서 이것을 가능하게하기 위해해야할 일이 있습니다.

    그 동안 매개 변수화 된 값이있는 SKIP 및 LIMIT 절을 쿼리에 추가하고 via의 적절한 값을 쿼리 메서드에 전달할 수 있습니다. 나는 이것을 시도하지 않았지만 이론적으로는 효과가있다.

      @Query("MATCH (t:Topic)-[:HAS_OFFICER]->(u:User) "
    + "WHERE t.id = {0} "
    + "RETURN  u SKIP {1} LIMIT {2}" )
    public List<User> topicOfficers(long topicId, long skip, long limit)
    
  2. ==============================

    2.이제 쿼리에서 Sort 또는 Pageable 인터페이스를 사용하여 허용되며 DATAGRAPH-653에서 수정되었으며 버전 4.2.0.M1 (현재 시험판)에서 수정 됨으로 표시되었습니다.

    이제 쿼리에서 Sort 또는 Pageable 인터페이스를 사용하여 허용되며 DATAGRAPH-653에서 수정되었으며 버전 4.2.0.M1 (현재 시험판)에서 수정 됨으로 표시되었습니다.

    다음과 같은 쿼리가 가능합니다.

    @Query("MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN actor")
    List<Actor> getActorsThatActInMovieFromTitle(String movieTitle, Sort sort);
    

    과:

    @Query("MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN actor")
    Page<Actor> getActorsThatActInMovieFromTitle(String movieTitle, PageRequest page);
    

    (Spring Data + Neo4j 문서의 Cypher 예제 샘플)

    프로젝트 페이지의 모든 릴리스에 대한 종속성 정보를 볼 수 있습니다. 그리고 4.2.0.M1 빌드에서 Maven을 추론 할 수있는 Gradle에 대한 정보는 다음과 같습니다.

    dependencies {
        compile 'org.springframework.data:spring-data-neo4j:4.2.0.M1'
    }
    
    repositories {
        maven {
            url 'https://repo.spring.io/libs-milestone'
        }
    }
    

    대신 최신 릴리스를 사용해야합니다.

  3. from https://stackoverflow.com/questions/30624435/paging-and-sorting-in-spring-data-neo4j-4 by cc-by-sa and MIT license