Spring Data Neo4j 4 中的分页和排序
Paging and sorting in Spring Data 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);
}
目前这是不可能的。
要启用此功能,我们需要做一些事情。首先在启动时,我们需要检查查询的关联方法签名并将查询标记为需要分页。然后在运行时调用该方法时,我们需要获取可分页实例,提取页面参数并将它们作为 SKIP 和 LIMIT 子句应用于关联的 Cypher 查询。最后,在 return,我们需要将结果包装在 Page 对象中。因此,要实现这一点,还有一些工作要做。
在此期间,您可以尝试将带有参数化值的 SKIP 和 LIMIT 子句添加到查询中,并将适当的值传递给查询方法。我没试过这个,但它应该有效 - 理论上:
@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)
现在允许在您的查询中使用 Sort
或 Pageable
接口,并且已在 DATAGRAPH-653 中修复并在版本 4.2.0.M1
中标记为已修复(目前在 pre -发布).
可以进行如下查询:
@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 Examples 的示例)
查找 Spring 数据 Neo4j 预发布里程碑构建:
您可以在项目页面上查看dependencies information for any release。对于 4.2.0.M1
构建 Gradle 的信息(您可以推断 Maven)是:
dependencies {
compile 'org.springframework.data:spring-data-neo4j:4.2.0.M1'
}
repositories {
maven {
url 'https://repo.spring.io/libs-milestone'
}
}
应改用任何较新的最终版本。
作为@Jayson Minard 回答的后续,更新版本的 Spring Data Neo4j (6.0.7+) 需要一个计数查询附加到 return Page
对象,如:
@Query(value = "MATCH (t:Topic)-[:HAS_OFFICER]->(u:User) WHERE t.id = {0} "
+ "RETURN u SKIP $skip LIMIT $limit",
countQuery = "MATCH (t:Topic)-[:HAS_OFFICER]->(u:User) WHERE t.id = {0} "
+ "RETURN count(u)")
public Page<User> topicOfficers(Long topicId, Pageable pageable);
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);
}
目前这是不可能的。
要启用此功能,我们需要做一些事情。首先在启动时,我们需要检查查询的关联方法签名并将查询标记为需要分页。然后在运行时调用该方法时,我们需要获取可分页实例,提取页面参数并将它们作为 SKIP 和 LIMIT 子句应用于关联的 Cypher 查询。最后,在 return,我们需要将结果包装在 Page 对象中。因此,要实现这一点,还有一些工作要做。
在此期间,您可以尝试将带有参数化值的 SKIP 和 LIMIT 子句添加到查询中,并将适当的值传递给查询方法。我没试过这个,但它应该有效 - 理论上:
@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)
现在允许在您的查询中使用 Sort
或 Pageable
接口,并且已在 DATAGRAPH-653 中修复并在版本 4.2.0.M1
中标记为已修复(目前在 pre -发布).
可以进行如下查询:
@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 Examples 的示例)
查找 Spring 数据 Neo4j 预发布里程碑构建:
您可以在项目页面上查看dependencies information for any release。对于 4.2.0.M1
构建 Gradle 的信息(您可以推断 Maven)是:
dependencies {
compile 'org.springframework.data:spring-data-neo4j:4.2.0.M1'
}
repositories {
maven {
url 'https://repo.spring.io/libs-milestone'
}
}
应改用任何较新的最终版本。
作为@Jayson Minard 回答的后续,更新版本的 Spring Data Neo4j (6.0.7+) 需要一个计数查询附加到 return Page
对象,如:
@Query(value = "MATCH (t:Topic)-[:HAS_OFFICER]->(u:User) WHERE t.id = {0} "
+ "RETURN u SKIP $skip LIMIT $limit",
countQuery = "MATCH (t:Topic)-[:HAS_OFFICER]->(u:User) WHERE t.id = {0} "
+ "RETURN count(u)")
public Page<User> topicOfficers(Long topicId, Pageable pageable);