我对Neo4j比较陌生,对使用spring在Neo4j中编写动态查询有疑问。 根据我的阅读,查询在扩展GraphRepository类的接口中使用@Query参数进行注释,动态参数作为参数提供。
但是我的要求是我必须动态生成where子句的数量。
For example,
@Query("match n where n.__type__='com.connectme.domain.Person' and n.age > {0} return n.id)
public List<Object> getPeopleWithAge(Integer age);//
我的查询也可以更改,其中年龄也可以小于某个值,在这种情况下,查询可以变为:
@Query("match n where n.__type__='com.connectme.domain.Person' and n.age > {0} and n.age <{1} return n.id)
public List<Object> getPeopleWithAge(Integer age1, Integer age2);//
以类似的方式,围绕age参数的许多子句可能导致where子句的变化。 我如何动态处理这个当前我只知道这种带注释的执行查询的方式。 我可以覆盖并编写自己的自定义查询吗?
答案 0 :(得分:2)
您可以编写自己的自定义查询逻辑。首先,您创建一个包含自定义查询方法的额外接口,以便获得两个存储库接口
public interface YourRepository extends GraphRepository<SomeClass> implements YourRepositoryExtension{
//inferred queries, annotated queries
}
public interface YourRepositoryExtension {
EndResult<SomeClass> customQuery();
Iterable<SomeClass> customTraversal();
}
然后你做了一个实现:
@Repository
public class YourRepositoryImpl implements YourRepositoryExtension {
@Autowired
private YourRepository yourRepository;
@Override
public EndResult<SomeClass> customQuery(){
//your query logic, using yourRepository to make cypher calls.
return yourRepository.query("START n.. etc.. RETURN n", <optional params>);
}
@Override
public Iterable<SomeClass> customTraversal(){
SomeClass startNode = yourRepository.findOne(123);
return yourRepository.findAllByTraversal(startNode, <some custom traversal>);
}
}