我在做springboot整合neo4j时,遇到不少坑,让我耗时最长,也是最无语的一个坑就是注解属性替换问题,做个笔记记录一下
首先neo4j整合成功,然后可以通过自带的新增,删除,查询方法,做一些简单的操作,但当你想做一个自定义查询的时候就得在Dao层编写方法,就在这里
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Repository
public interface DimingDao extends Neo4jRepository<Diming,Long> {
List<Diming> queryshort(String name1, String name2);
}
方法是写好了,但谁来实现成了问题,这时候就要用到@Query注解。我网上查了很多,发现不少人是这么写的
通过{}来替换字符串中的值,很多人都这么写的,而我就不行,总给我报错,说语法不对。于是我问了一个好心的大佬,告诉我说不要用{},而是用' '单引号,我信了,果然没报错。但他给neo4j传的值就是name,不是name的值,我无语了。。。。
于是乎,我又找到一个博主,终于解答了我的疑惑,我们可以用$符来替换值,就比如上面那个例子,不用{},也不用' ',而是直接用$name就ok了
@Repository
public interface DimingDao extends Neo4jRepository<Diming,Long> {
@Query(value = "match (a:diming{name:$name1}),(b:diming{name:$name2}) ,p=shortestpath((a)-[*..10]->(b)) return p")
List<Diming> queryshort(@Param(value="name1") String name1,@Param(value="name2") String name2);
}
还得注意添加@Param注解
但是我又遇到一个问题,如果我传的是对象怎么办?
刚开始我是这么写的,他给我报语法错误
@Repository
public interface DimingDao extends Neo4jRepository<Diming,Long> {
@Transactional
@Query(value = "match (a:diming{id:$diming.getId}) set a.name=$diming.getName")
void update(@Param(value = "diming") Diming diming);
}
最后还是没能解决,不想找了,妥协了。。。。
于是我就给他单独传了id和name
@Repository
public interface DimingDao extends Neo4jRepository<Diming,Long> {
@Transactional
@Query(value = "match (a:diming{id:$id}) set a.name=$name")
void update(@Param(value = "id") Long id,@Param("name") String name);
}
这个问题虽然解决了,但发现又冒出一个问题,neo4j既然不能通过id查询。。。。新发现哈。。。
这里青岛这个节点的id为9,
我试着根据id查找节点,既然找不到
有谁知道原因的评论区解答下呗,实在不行这个我也妥协,单独设置id属性