【发布时间】:2017-01-18 17:43:07
【问题描述】:
我正在研究 Neo4J 的 spring 数据,我已经看到了一些示例,其中您只需按照一些标准(通过特定属性查找)在存储库接口中定义一个方法,并且它由 spring 自动处理。例如:findByName。
它对基本属性非常简单,但当属性实际上是一个关系时,它似乎不起作用。
看这个例子:
public class AcceptOrganizationTask extends AbstractTask {
@Relationship(type="RELATES_TO", direction = "OUTGOING")
private OrganizationInvite invitation;
...
}
在存储库接口中,我定义了 3 个方法(都具有相同的目标):
List<AcceptOrganizationTask> findAllByInvitation(OrganizationInvite invite);
@Query("MATCH (i:OrganizationInvite)<-[RELATES_TO]-(t:AcceptOrganizationTask) WHERE i={invite} RETURN t")
List<AcceptOrganizationTask> getTaskByInvitation(@Param("invite") OrganizationInvite invite);
AcceptOrganizationTask findByInvitation_Id(Long invitationId);
他们都无法通过其邀请属性检索任务。但是,如果我使用 findAll(),我可以获得与正确邀请关联的属性的对象。
我错过了什么吗?
下面我已经为这三种方法生成了 Cypher 代码:
findAllByInvitation
MATCH (n:`AcceptOrganizationTask`)
WHERE n.`invitation` = { `invitation_0` }
WITH n MATCH p=(n)-[*0..1]-(m) RETURN p, ID(n)
with params {invitation_0={entityId=15, version=0, createdOn=1484758262374, lastChanged=1484758262374, createUser=null, lastUpdatedBy=null, email=user2@acme.com, randomKey=fc940b14-12c3-4894-b2b4-728e3a6b8036, invitedUser={entityId=11, version=0, createdOn=1484758261450, lastChanged=1484758261450, createUser=null, lastUpdatedBy=null, name=User user2@acme.com, email=user2@acme.com, credentialsNonExpired=true, lastPasswordResetDate=null, authorities=null, authoritiesInDB=[], accountNonExpired=true, accountNonLocked=true, enabled=true, id=11}, id=15}}
getTasksByInvitation
MATCH (i:OrganizationInvite)<-[RELATES_TO]-(t:AcceptOrganizationTask)
WHERE i={invite} RETURN t with params {invite=15}
findByInvitation_Id
MATCH (n:`AcceptOrganizationTask`)
MATCH (m0:`OrganizationInvite`)
WHERE m0.`id` = { `invitation_id_0` }
MATCH (n)-[:`RELATES_TO`]->(m0)
WITH n
MATCH p=(n)-[*0..1]-(m) RETURN p, ID(n)
with params {invitation_id_0=15}
所有实体都继承自一个公共 AbstractEntity 和 Long id 字段,并用 @GraphId 注释。
我错过了什么吗?
【问题讨论】: