is there pagination support for custom queries in SDN4?
I have the following Spring Data Neo4j 4 repository:
@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);
}
And the corresponding testcase:
@Test
public void itShouldReturnAllOfficersAsAPage() {
Pageable pageable = new PageRequest(1,10);
Page<User> officers = topicRepository.topicOfficers(1L, pageable);
assertNotNull(officers);
}
When I run the test, I run into the following exception
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<?>
This is my setup:
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')
}
The Snapshot I use should able to handle pagination, since the following test runs just fine:
@Test
public void itShouldReturnAllTopicsAsAPage() {
Pageable pageable = new PageRequest(1,10);
Page<Topic> topics = topicRepository.findAll(pageable);
assertNotNull(topics);
}
Paging and sorting is mostly required when we are displaying domain data in tabular format in UI. Pagination consist of two fields – page size and page number. Sorting is done on a single of multiple fields in the table.
Pagination is used to display a large number of records in different parts. In such case, we display 10, 20 or 50 records in one page. For remaining records, we provide links. We can simply create pagination example in Spring MVC.
Pagination is often helpful when we have a large dataset and we want to present it to the user in smaller chunks. Also, we often need to sort that data by some criteria while paging. In this tutorial, we'll learn how to easily paginate and sort using Spring Data JPA.
pageable (not comparable) That can be paged. (computer science, of computer memory) That accepts paging.
This is now allowed using Sort
or Pageable
interfaces in your query, and was fixed in DATAGRAPH-653 and marked as fixed in version 4.2.0.M1
(currently in pre-release).
Queries such as the following are possible:
@Query("MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN actor")
List<Actor> getActorsThatActInMovieFromTitle(String movieTitle, Sort sort);
and:
@Query("MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN actor")
Page<Actor> getActorsThatActInMovieFromTitle(String movieTitle, PageRequest page);
(sample from Cypher Examples in the Spring Data + Neo4j docs)
You can view the dependencies information for any release on the project page. And for the 4.2.0.M1
build the information for Gradle (you can infer Maven) is:
dependencies {
compile 'org.springframework.data:spring-data-neo4j:4.2.0.M1'
}
repositories {
maven {
url 'https://repo.spring.io/libs-milestone'
}
}
Any newer final release should be used instead.
At the moment this isn't possible.
To enable this feature we'd need to do a few things. First at startup we would need to inspect the query's associated method signature and mark the query as requiring paging. Then at runtime when the method was invoked we'd need to obtain the pageable instance, extract the page parameters and apply them as SKIP and LIMIT clauses to the associated Cypher query. Finally, on return, we'd need wrap the results in a Page object. So there's a bit of work to be done to enable this.
In the meantime you could try adding the SKIP and LIMIT clauses with parameterised values to the query, and pass the appropriate values in via to the query method. I haven't tried this, but it should work - in theory:
@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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With