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