2017-08-16 2 views
2

NodeEntity:données Spring Neo4j liste de requête personnalisée params pas utiliser le convertisseur

@NodeEntity(label = "User") 
public class UserNode { 
    @GraphId 
    private Long _gid; 

    @Index(unique = true, primary = true) 
    @Convert(ObjectIdConverter.class) 
    private ObjectId id; 
} 

Converter:

public class ObjectIdConverter implements AttributeConverter<ObjectId, String>{ 
    @Override 
    public String toGraphProperty(ObjectId value) { 
     return ObjectIdUtils.compressed(value); 
    } 

    @Override 
    public ObjectId toEntityAttribute(String value) { 
     return ObjectIdUtils.uncompress(value); 
    } 
} 

Repository:

public interface UserNodeRepository extends GraphRepository<UserNode> { 
    @Query("MATCH (user:User) WHERE user.id IN {0} RETURN user") 
    List<UserNode> findByIdIn(List<ObjectId> ids); 
} 

UserNodeRepository # findByIdIn est requête personnalisée. mais le paramètre de demande directement convertir en json sans utiliser ObjectIdConverter.

Log:

o.n.o.drivers.bolt.request.BoltRequest : Request: MATCH (user:User) WHERE user.id IN {0} RETURN user with params {0=[{timestamp=1500442853, machineIdentifier=11302907, processIdentifier=11906, counter=4709865, time=1500442853000, date=1500442853000, timeSecond=1500442853}, {timestamp=1500445335, machineIdentifier=11302907, processIdentifier=11906, counter=4709946, time=1500445335000, date=1500445335000, timeSecond=1500445335}, {timestamp=1500447522, machineIdentifier=11302907, processIdentifier=11906, counter=4710014, time=1500447522000, date=1500447522000, timeSecond=1500447522}, {timestamp=1500448399, machineIdentifier=11302907, processIdentifier=11906, counter=4710092, time=1500448399000, date=1500448399000, timeSecond=1500448399}]} 

Est-ce l'attente ou NRS quels concepts ai-je perdu?

Répondre

1

Ceci n'est pas possible pour les trouveurs avec @Query personnalisé. Il n'y a aucun moyen pour OGM de savoir que votre paramètre se rapporte à une propriété avec l'annotation @Convert (le nom de la méthode n'est pas utilisé du tout). Pour résoudre ce converti à votre type de propriété manuellement au lieu et l'utiliser comme un paramètre:

@Query("MATCH (user:User) WHERE user.id IN {0} RETURN user") 
List<UserNode> findByIdIn(List<String> ids); 

Cependant, cela fonctionne très bien pour trouveurs dérivés - OGM connaît le champ et l'annotation @Convert avec le convertisseur droit, de la nom de la méthode.

Exemple avec un seul paramètre:

List<UserNode> findById(ObjectId id); 

Malheureusement, il semble être un bug pour l'opérateur IN et un paramètre de collection avec:

// doesn't work 
List<UserNode> findByIdIn(List<ObjectId> ids); 

J'ai créé a jira issue.

+0

même bug de la liste paramètre + 1. – Alex