Je suis en train d'étudier spring data pour Neo4J et j'ai vu des exemples où vous définissez simplement une méthode dans l'interface du repository en suivant certaines normes (pour trouver par un attribut spécifique) et c'est automatiquement géré par spring. Ex : findByName.
Cela fonctionne très simplement avec des attributs de base mais cela ne semble pas fonctionner lorsque l'attribut est en fait une relation.
Voyez cet exemple :
public class AcceptOrganizationTask extends AbstractTask {
@Relationship(type="RELATES_TO", direction = "OUTGOING")
private OrganizationInvite invitation;
...
}
Dans l'interface du repository, j'ai défini 3 méthodes (toutes avec le même objectif) :
List findAllByInvitation(OrganizationInvite invite);
@Query("MATCH (i:OrganizationInvite)<-[RELATES_TO]-(t:AcceptOrganizationTask) WHERE i={invite} RETURN t")
List getTaskByInvitation(@Param("invite") OrganizationInvite invite);
AcceptOrganizationTask findByInvitation_Id(Long invitationId);
Aucune d'entre elles ne parvient à récupérer la tâche par sa propriété d'invitation. Mais si j'utilise findAll(), je peux obtenir l'objet avec la propriété associée à l'invitation correcte.
Est-ce que j'oublie quelque chose ?
Ci-dessous, j'ai le code Cypher généré pour ces trois méthodes :
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}
Toutes les entités héritent d'une entité AbstractEntity commune avec un champ Long id, annoté avec @GraphId.
Est-ce que j'oublie quelque chose ?