无法找到NodeEntity或相关实体

时间:2017-10-02 22:19:35

标签: spring-boot neo4j spring-data-neo4j-4

亲爱的,

我使用Spring Boot(1.5.7.RELEASE)和Spring数据neo4j(4.2.7.RELEASE)和neo4j-ogm(2.1.5)创建了一个非常简单的应用程序。

我的pom.xml的相关部分:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-ogm-test</artifactId>
    <version>${neo4j-ogm.version}</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>

我有两个简单的实体和一个父(具有常见的东西):

@NodeEntity
public abstract class BaseEntity {

    @GraphId
    private Long id;

    @Convert(value = InstantConverter.class)
    private Instant createdOn;

    private Date modifiedOn;
}

public class User extends BaseEntity {

    @Index(unique = true)
    private String username;

    @Index(unique = true)
    private String email;

    private String password;

    public User() {
        //default
    }

    public User(String username, String email, String password) {
        this.username = username;
        this.email = email;
        this.password = password;
    }
}

public class Tag extends BaseEntity {
    @Index
    private String label;

    @Relationship(type = "CREATOR")
    private User creator;

    public Tag() {}

    public Tag(String label, User creator) {
        this.label = label;
        this.creator = creator;
    } 
}

为清晰起见,我删除了setters / getters / equals / hashcode。

将此配置用于Neo4j,尝试尽可能简单:

@Configuration
@EnableNeo4jRepositories(value = "xxx.repository")
public class Neo4jConfiguration {
    @Bean
    public NewEntityPreSaveEventListener newEntityPreSaveEventListener() {
        return new NewEntityPreSaveEventListener();
    }
}

这是我使用的存储库:

@Repository
public interface TagRepository extends GraphRepository<Tag> {
    Tag findOneByLabelAndCreator(String label, User creator);

    Tag findOneByLabel(String label);

    Tag findOneByCreator(User creator);

    @Query("MATCH (tag:Tag)-[:CREATOR]->(creator:User) WHERE id(creator) = {creatorId} RETURN tag")
    @Depth(value = 5)
    Tag getByCreator(@Param("creatorId") User creator);
}

所以没什么特别的,真的......

假设:

User myCreator = userRepository.save(new User("myCreator", "email", "password"));
Tag myTag = tagRepository.save(new Tag("taglabel", myCreator));

当我做&#34; tagRepository.findOneByLabel(&#34; taglabel&#34;)&#34;或者,它返回所有属性设置的标记。完美!

当我执行&#34; tagRepository.findOneByCreator(myCreator)&#34;时,它只返回null。

当我执行&#34; tagRepository.getByCreator(myCreator)&#34;时,它返回带有正确标签的标签但是属性&#34;创建者&#34;是空的。

我真的不明白。当然,我阅读了文档,并尝试了几个方面(@Depth,自定义@Query,在字段上的User类中添加@Relationship&#34;设置标记&#34;,删除索引等)。它根本不想正常工作。 这很简单,我应该错过一些非常非常愚蠢的东西...... 不幸的是,我发现的所有例子都比这个更简单......这不是很有帮助。

有什么想法吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

当我执行&#34; tagRepository.findOneByCreator(myCreator)&#34;时,它只返回null。

打开org.neo4j.ogm的信息记录,并检查生成的密码查询。

  

当我执行&#34; tagRepository.getByCreator(myCreator)&#34;时,它返回带有正确标签的标签但是属性&#34;创建者&#34;是空的。

请参阅文档的this part

  

自定义查询不支持自定义深度。此外,@ Query不支持将路径映射到域实体,因此,不应从Cypher查询返回路径。相反,返回节点和关系以将它们映射到域实体。

所以你需要返回你想要映射的所有节点/关系,而且你需要自己处理查询中的深度。

@Query("MATCH (tag:Tag)-[:CREATOR]->(creator:User) " +
       "WHERE id(creator) = {creatorId} WITH tag " +
       "MATCH p=(tag)-[*..5]-() " +
       "RETURN nodes(p),relationships(p)")
@Depth(value = 5)
Tag getByCreator(@Param("creatorId") User creator);