spring 数据 neo4j 4.2.0.RELEASE 自定义查询问题

spring data neo4j 4.2.0.RELEASE custom query issue

这是代码:

@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")
}

这是模型 class:

@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>

spring 数据提供的默认 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();
}

method get 应该做什么?通过名字获取用户?您需要添加过滤器位置:按属性过滤 firstName in Person.

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

原来 Spring 不会自动将参数绑定到查询。

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

这个很好用