Creación de un generador de consultas personalizado en Spring Data Neo4j (Parte 1)

Para empezar, surgió la tarea de generar solicitudes de cifrado para clases de datos basadas en @NodeEntity , @RelationshipEntity y @Relationship y parámetros adicionales. Se escribió un generador de consultas, pero la cadena de consulta se calculó en tiempo de ejecución y no pudimos usarla como un parámetro de la anotación @Query existente, por lo que se agregó una nueva anotación @CustomQuery , cuyo procesador utilizó un generador de consultas escritas.


Versiones de software usado:


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


Agregar un generador de consultas personalizado a Spring Data Neo4j


Para agregar su propio mecanismo para generar solicitudes de cifrado para los métodos de repositorio neo4j marcados, por ejemplo, con la anotación @CustomQuery , debe crear la CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory y redefinir el método getQueryLookupStrategy en ella; debería devolver una nueva consulta de CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy consulta CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy


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

También es necesario extender la clase estándar Neo4jRepositoryFactoryBean nueva clase CustomNeo4jRepositoryFactoryBean y anular el método createRepositoryFactory . Debería devolver una instancia de la nueva fábrica de repositorios:


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

Para que Spring Data Neo4j entienda qué bean de fábrica de repositorios usar, debe especificarse explícitamente en la anotación @EnableNeo4jRepositories en la configuración:


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

Se ha CustomQuery anotación de consulta CustomQuery adicional. Si el método de repositorio está marcado con esta anotación, CustomGraphQueryLookupStrategy en el método de resolveQuery sobrescritura devolverá el objeto de nuestra solicitud 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 implementa un método getQuery que devuelve un objeto Query ; su constructor acepta una consulta CustomGraphRepositoryQuery que se creó en CustomGraphRepositoryQuery en función de los datos de la anotación CustomQuery y el objeto Method marcado con esta anotación:


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

El resolveParametres(Object[]) y el resolveParametres(Object[]) usa son privados en GraphRepositoryQuery , por lo que simplemente se copiaron en CustomGraphRepositoryQuery (puede usar la reflexión, esto no afectará el rendimiento, ya que la generación de consultas se produce antes del tiempo de ejecución).


Conclusión


Por lo tanto, puede declarar su propio mecanismo para generar solicitudes de cifrado, si es necesario.


Los siguientes artículos describirán el generador de consultas en sí, sus parámetros, el mecanismo de trabajo, los problemas encontrados y su solución.

Source: https://habr.com/ru/post/es434902/


All Articles