当前位置: 首页 > 知识库问答 >
问题:

Spring Data Neo4j关系实体存储库

萧晔
2023-03-14

我希望像查询NodeEntity一样查询RelationshipEntity。

软件包信息:

groupId=org.springframework.data
artifactId=spring-data-neo4j
version=5.1.5.RELEASE
@NodeEntity("Employee")
public class Employee{

    @Id
    @GeneratedValue
    Long id;
    String name;

    // Id
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    // Name
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Relationship(type = STARTED, direction = Relationship.OUTGOING)
    private List<Status> starts = new ArrayList<>();

    @Relationship(type = PAUSED, direction = Relationship.OUTGOING)
    private List<Status> pause = new ArrayList<>();

    @Relationship(type = STOPED, direction = Relationship.OUTGOING)
    private List<Status> stops = new ArrayList<>();

    @Relationship(type = COMPLETED, direction = Relationship.OUTGOING)
    private List<Status> action = new ArrayList<>();

    // Default Relationship
    @Relationship(type = ACTION, direction = Relationship.OUTGOING)
    private List<Status> action = new ArrayList<>();
}

@NodeEntity("Project")
public class Project{

    @Id
    @GeneratedValue
    Long id;
    String name;

    // Id
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    // Name
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

@RelationshipEntity
public class Status {

    @Id
    @GeneratedValue
    Long id;
    String name;

    // Id
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    // Name
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @StartNode
    private Employee employee;

    @EndNode
    private Project project;
}

public interface EmployeeRepository extends CrudRepository<Employee, Long> {
    Employee findByName(String name);

    @Query("MATCH (e:Employee)-[r]->(p:Project) WHERE e.name={empName} AND p.name={prjName} RETURN e ")
    Employee getEmployeeWorkingOnProjectId(@Param("empName") String empName, @Param("prjName") String prjName);
}

此存储库不工作。
getEmployeeWorkingOnProject(String,String)返回NULL

我在return关键字之后进行了修改,例如将其从return*修改为像returnee、r、p这样的别名,并且还尝试更改了返回中别名的顺序。

我希望获得与特定员工和特定项目相关联的所有状态(边缘)。

public interface StatusRepository extends CrudRepository<Status, Long> {

    @Query("MATCH (e:Employee)-[r]->(p:Project) WHERE e.name={empName} AND p.name={prjName} RETURN * ")
    Status getEmployeeWorkingOnProject(@Param("empName") String empName, @Param("prjName") String prjName);


    /* OR 
    @Query("MATCH (e:Employee)-[r]->(p:Project) WHERE e.name={empName} AND p.name={prjName} AND r.name={statusName} RETURN * ")
    Status getEmployeeWorkingOnProject(@Param("empName") String empName, @Param("prjName") String prjName, @Param("statusName") String statusName)
    */
}
{
  Status: {
    name: ..,
    Employee: {
      ...
    },
    Project: {
      ...
    }
  }
},
{
  Status: {
    name: ..,
    Employee: {
      ...
    },
    Project: {
      ...
    }
  }
},
..

STARTED : {
  Employee: {
    ...
  },
  Project: {
    ...
  }
},
STOPPED : {
  Employee: {
    ...
  },
  Project: {
    ...
  }
},

或其他类型的类似结果,其中关系实体持有两个连接节点。

共有1个答案

梁骞仕
2023-03-14

在从下面提到的Employee(model/entity)中移除特定代码后,我能够使StatusRepository工作:

    @Relationship(type = STARTED, direction = Relationship.OUTGOING)
    private List<Status> starts = new ArrayList<>();

    @Relationship(type = PAUSED, direction = Relationship.OUTGOING)
    private List<Status> pause = new ArrayList<>();

    @Relationship(type = STOPED, direction = Relationship.OUTGOING)
    private List<Status> stops = new ArrayList<>();

    @Relationship(type = COMPLETED, direction = Relationship.OUTGOING)
    private List<Status> action = new ArrayList<>();

    // Default Relationship
    @Relationship(type = ACTION, direction = Relationship.OUTGOING)
    private List<Status> action = new ArrayList<>();

 类似资料:
  • 保存“我的实体”时,通过关系工作的子实体不会保存到它们的表中。我不明白怎么回事。 员工: EmployeePhoneNumber: 如何设置这些字段,然后保存实体: 在完成该方法后,我没有一个错误,所有的工作都是正确的,只是表格没有填满--为什么?

  • 我对关系如何在实体中工作以及这对我的JPA存储库意味着什么感到困惑。 我有一个名为Loan的类,它为每个贷款存储一个专辑列表。 我有一个贷款库和一个专辑库。当我启动应用程序时,相册存储库中充满了相册。该专辑是自动生成的。 我也很困惑为什么专辑必须引用带有ManyToOne注释的贷款。为什么相册必须提到贷款? 我大多习惯于关系数据库,所以也许我在以错误的方式思考事情。如果我只能添加新的专辑到贷款,那

  • 此代码崩溃: 原因:组织。postgresql。util。PSQLException:错误:关系“订阅”不存在 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect Springjpa。数据库平台=组织。冬眠地方话PostgreSQL10方言Spring。jpa。冬眠ddl auto=创建拖放

  • 本章将向您介绍实体之间的关系。 通常,关系在数据库中的表之间更有效。 这里实体类被视为关系表(JPA的概念),因此实体类之间的关系如下: @ManyToOne关系 @OneToMany关系 @OneToOne关系 @ManyToMany关系 @ManyToOne关系 实体之间的多对一关系:其中一个实体(列或列集)被包含唯一值的另一个实体(列或列集)引用。 在关系数据库中,通过在表之间使用外键/主键

  • 我正在将nTier架构迁移到六边形架构中。我的域现在定义得很好,我有所有基础设施依赖项的接口。查看数据库存储库,我有几个数据库,在下面的一侧有一个类实现每个repo。我的问题是关于数据库依赖项的正确方法是什么: 1-在域端有一个接口来处理数据访问,然后依赖于基础设施实现,并有一个类作为所有数据库存储库的入口点,就像一个facade,从那里调用所有存储库实现。这种方法与我在nTier应用程序中已经使

  • 我有2个实体(我删除了无用的字段): 而且 这似乎符合我的情况(也是我当前的实现),但它不起作用。 我得到以下错误消息: 来自MySQL: 临时解决方案是从存储库中检索所有相应的权限(按permissionName搜索)。那么保存效果很好。逻辑上是正确的,但我希望有一个更简单的程序...