将参数传递给Spring数据Neo4J中@query中的cypher查询

将参数传递给Spring数据Neo4J中@query中的cypher查询,neo4j,spring-data-neo4j,Neo4j,Spring Data Neo4j,我有一个用户域:1)字符串用户名,2)字符串密码,3)角色[]角色(角色是枚举) my UserRepository中的方法如下所示: @Query("MERGE (n:User:_User { username: \"{0}.username\", password: \"{0}.password\", roles: \"{0}.roles\" }) RETURN n") User registerUser(User user); 这会抛出org.springframework.core.c

我有一个用户域:1)字符串用户名,2)字符串密码,3)角色[]角色(角色是枚举)

my UserRepository中的方法如下所示:

@Query("MERGE (n:User:_User { username: \"{0}.username\", password: \"{0}.password\", roles: \"{0}.roles\" }) RETURN n")
User registerUser(User user);
这会抛出
org.springframework.core.convert.ConversionFailedException
,因为它无法将字符串转换为角色,角色是枚举。如果我去掉{0}.roles周围的引号,它将抛出以下内容:

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is org.neo4j.helpers.ThisShouldNotHappenError: Developer: Andres claims that: Need something with properties
如果用户参数可以直接序列化到合并查询或以任何方式解析此角色[],这将是理想的

有人能帮我吗?我使用的是SDN 3.1.0和Neo4J 2.0.3

更新1:理想情况下,最好做以下事情:

@Query("MERGE (n:User:_User {0}) RETURN n")
User registerUser(User user);

我不确定这将如何得到支持。它必须将用户转换为要用作参数的映射,通常在传入实体时,它会转换为该实体的内部节点id

为什么不直接执行
模板.保存(用户)

您可以尝试分别传入参数

@Query("MERGE (n:User:_User { username: {0}, password: {1}, roles: {2} }) RETURN n")
User registerUser(String name, String password, Collection<String> roles);
@Query(“合并(n:User:_User{username:{0},密码:{1},角色:{2})返回n”)
用户注册服务器(字符串名称、字符串密码、集合角色);

这对我来说确实有效

传递参数引用名称,而不是传递参数位置

@Query("MERGE (n:User:_User { username: {name}, password: {password}, roles: {roles} }) RETURN n")
User registerUser(String name, String password, Collection<String> roles);
@Query(“合并(n:User:_User{username:{name},password:{password},roles:{roles})返回n”)
用户注册服务器(字符串名称、字符串密码、集合角色);

非常感谢Michael!我确实尝试过单独传递参数,并且成功了——但这意味着每次修改域时都会发生变化。保存(用户)将合并到图中的现有节点。我想实现一些类似于createunique的功能,使用MERGE作为额外的调用来检查节点是否存在是多余的。我应该改用createunique吗(文档似乎建议从2.x开始改用MERGE)?所以我们不能在查询中使用pojo参数的属性?我希望执行类似于{0}.username的操作