在Spring Data Neo4j中创建自定义查询生成器(第1部分)

首先,出现了根据@NodeEntity@RelationshipEntity@Relationship以及其他参数为数据类生成密码请求的任务。 编写了查询生成器,但是查询字符串是在运行时计算的,我们不能将其用作现有@Query注释的参数,因此添加了新的@CustomQuery注释,其处理器使用了书面查询生成器。


所用软件的版本:


spring-data-neo4j-5.0.9.RELEASE
neo4j-3.4.6
neo4j-ogm-3.1.4


向Spring Data Neo4j添加自定义查询生成器


要添加您自己的机制来生成针对带有@CustomQuery标记的neo4j存储库方法的密码请求, @CustomQuery需要创建CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory并在其中重新定义getQueryLookupStrategy方法;它应该返回一个新的查询CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy


 @Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(QueryLookupStrategy.Key key, EvaluationContextProvider evaluationContextProvider) { return Optional.of(new CustomGraphQueryLookupStrategy(session)); } 

Neo4jRepositoryFactoryBean新的CustomNeo4jRepositoryFactoryBean类扩展标准Neo4jRepositoryFactoryBeanNeo4jRepositoryFactoryBean并重写createRepositoryFactory方法。 它应该返回新存储库工厂的实例:


 @Override protected RepositoryFactorySupport createRepositoryFactory(Session session) { return new CustomNeo4jRepositoryFactory(session); } 

为了让Spring Data Neo4j理解要使用哪个存储库工厂Bean,必须在配置中的@EnableNeo4jRepositories批注中显式指定它:


 @EnableNeo4jRepositories(..., repositoryFactoryBeanClass = CustomNeo4jRepositoryFactoryBean.class) 

CustomQuery附加的CustomQuery查询注释。 如果存储库方法带有此批注标记,则覆盖的resolveQuery方法中的CustomGraphQueryLookupStrategy将返回我们请求的对象CustomGraphRepositoryQuery extends GraphRepositoryQuery


 public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, ProjectionFactory factory, NamedQueries namedQueries) { if (method.isAnnotationPresent(CustomQuery.class)) { GraphQueryMethod queryMethod = new GraphQueryMethod(method, metadata, factory); return new CustomGraphRepositoryQuery(queryMethod, session, method.getAnnotation(CustomQuery.class)); } else { return super.resolveQuery(method, metadata, factory, namedQueries); } } 

CustomGraphRepositoryQuery实现了一个getQuery方法,该方法返回Query对象;其构造函数接受基于CustomQuery批注中的数据以及标有该批注的Method对象的,在CustomGraphRepositoryQuery构建的密码查询:


 @Override protected Query getQuery(Object[] parameters) { return new Query(query, resolveParams(parameters)); } 

它使用的resolveParametres(Object[])方法和resolveParametres(Object[])GraphRepositoryQuery是私有的,因此可以将它们简单地复制到CustomGraphRepositoryQuery (可以使用反射,这不会影响性能,因为请求生成是在运行时之前进行的)。


结论


因此,如有必要,您可以声明自己的生成密码请求的机制。


以下文章将描述查询生成器本身,其参数,工作机制,遇到的问题及其解决方案。

Source: https://habr.com/ru/post/zh-CN434902/


All Articles