2017-03-28 6 views
0

ここではコードです:ここでは春データのNeo4jの4.2.0.RELEASEのカスタムクエリ発行し

@Repository 
public interface PersonRepository extends Neo4jRepository<Person, Long> { 

    Person findOne(Long id); 
    Person findByFirstName(String firstName); 
    Person save(Person person); 
    boolean exists(Long id); 

    List<Person> findAll(); 

    @Query("MATCH (p:Person) RETURN p") 
    Person get(String n);} 

    @NodeEntity(label = "Person") 
} 

はモデルクラスです:

@NodeEntity 
public class Person{ 
    public Person(String firstName, String lastName){ 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public Person(Long id, String firstName, String lastName){ 
     this(firstName, lastName); 
     this.id = id; 
    } 

    @GraphId 
    @Property(name = "id") 
    @Index(unique = true) 
    @Getter 
    private Long id; 

    @Getter 
    @Property(name = "firstName") 
    private String firstName; 

    @Getter 
    @Property(name = "lastName") 
    private String lastName; 
} 

Spring構成:

@Configuration 
@EnableNeo4jRepositories("my_package.repository") 
@EnableTransactionManagement 
@ComponentScan("my_package") 
public class ApplicationConfiguration { 

    @Bean 
    public SessionFactory sessionFactory() { 
     // with domain entity base package(s) 
     return new SessionFactory("my_package.model"); 
    } 

    @Bean 
    public Neo4jTransactionManager transactionManager() { 
     return new Neo4jTransactionManager(sessionFactory()); 
    } 

} 

のMaven pom.xml:

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.8</java.version> 
    <lombok.version>1.16.14</lombok.version> 
    <spring-data-neo4j.version>4.2.0.RELEASE</spring-data-neo4j.version> 
    <lombok.version>1.16.14</lombok.version> 
    <spring.version>4.3.7.RELEASE</spring.version> 
    <neo4j.version>3.1.2</neo4j.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <version>${lombok.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-neo4j</artifactId> 
     <version>${spring-data-neo4j.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.neo4j</groupId> 
     <artifactId>neo4j-ogm-test</artifactId> 
     <version>2.1.0</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>4.3.7.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hamcrest</groupId> 
     <artifactId>hamcrest-all</artifactId> 
     <version>1.3</version> 
    </dependency> 


</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.6.1</version> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

スプリングデータによって提供されるデフォルトのCRUDメソッドは正常に機能しますが、カスタムのCypherクエリを持つメソッドは機能しません。私はCypherをよく知っているわけではありませんが、今まで見てきた他の例を考慮に入れてうまくいくはずです。私はいくつかの依存関係や何かを欠いていますか?

@Test 
public void testFindFriendsById(){ 
    Person main = new Person(10L, "mainname", "mainlastnmame"); 

    personRepository.save(main); 

    // here is that custom method from PersonRepository 
    // having this query : @Query("MATCH (p:Person) RETURN p") 
    Person person = personRepository.get(main.getFirstName()); 

    assertThat(person, is(notNullValue())); 
} 

任意の提案:ここ はコード調達の問題でしょうか?

UPD:私はテストのためにTESTSERVERを使用しています:

protected static TestServer testServer; 

@BeforeClass 
public static void setupTestServer() { 
    testServer = new TestServer.Builder().port(2222).build(); 
} 

答えて

2

したがって、Springではパラメータが自動的にクエリにバインドされていないことが判明しました。

@Query("MATCH (p:Person) where p.firstName = {name} return p") 
Person get(@Param("name") String name); 

これは細かい

0

方法は何を取得する必要がありますか? firstNameでユーザーを取得しますか?フィルタの位置を追加する必要があります:属性firstNameでフィルタをPersonに設定します。

@Query("MATCH (p:Person {firstName={0}}) RETURN p") 
+0

それは本当に問題doesntの、そう言うことができます動作します。私はちょうど私の設定が実際に動作することを確認するためにdbから唯一の人のノードをフェッチするために、最も単純な可能なクエリを実行したい。 Btw、あなたの提案がうまくいかない - 'org.springframework.dao.InvalidDataAccessResourceUsageException:Cypher" Neo.ClientError.Statement.SyntaxError "を実行中にエラーが発生しました。コード:Neo.ClientError.Statement.SyntaxError;説明:無効な入力 '=':識別子文字、空白、 ':' 'が期待されます。 @create( "MATCH(p:Person)WHERE p.firstName = {0} RETURN p") '何もしない –

関連する問題