2 votes

Spring data neo4j (SDN4) - trouver par relation

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 ?

0voto

digx1 Points 1010

Actuellement, les requêtes dérivées ne sont prises en charge que jusqu'à un niveau d'imbrication.

Nous espérons ajouter cette fonctionnalité bientôt dans les semaines à venir.

Pour l'instant, vous pouvez écrire une requête personnalisée @Query pour contourner cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X