首先,出现了根据@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
类扩展标准Neo4jRepositoryFactoryBean
类Neo4jRepositoryFactoryBean
并重写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
(可以使用反射,这不会影响性能,因为请求生成是在运行时之前进行的)。
结论
因此,如有必要,您可以声明自己的生成密码请求的机制。
以下文章将描述查询生成器本身,其参数,工作机制,遇到的问题及其解决方案。