Spring Data Neo4j实现customFindAll传入动态surname参数的查询问题
错误根因
你编写的代码无法运行的核心原因是:Spring Data Neo4j 中普通@Param注入的参数默认会作为属性值处理,自动添加字符串引号,而你代码里将surname作为节点的二级标签使用,标签属于Cypher的模式结构部分,不能被额外包裹引号,最终执行时会生成类似MATCH (n:User:"Zhang") return n的非法语法。
修复方案
场景1:确实需要把surname作为动态标签查询
使用SpEL表达式获取参数值,避免框架自动添加引号:
@Query("MATCH (n:User:`#{#surname}`) return n") Flux<UserEntity> customFindAll(@Param("surname") String surname);
注意:这种动态拼接Cypher结构的写法存在注入风险,你需要在业务层对传入的surname参数做严格的合法性校验,仅允许预设的标签值传入,避免恶意输入执行非法操作
场景2:实际需要查询User节点的surname属性等于传入值
如果是把surname作为节点属性做筛选,你的Cypher写法本身存在逻辑错误,改用属性匹配的写法即可,这种写法更安全,不需要动态拼接结构:
@Query("MATCH (n:User) WHERE n.surname = $surname return n") Flux<UserEntity> customFindAll(@Param("surname") String surname);
内容的提问来源于stack exchange,提问作者AndreaCavallo.class
相关产品推荐
相关产品推荐

