Erstellen eines benutzerdefinierten Abfragegenerators in Spring Data Neo4j (Teil 1)

Zunächst bestand die Aufgabe @NodeEntity , @RelationshipEntity für Datenklassen basierend auf den @NodeEntity , @RelationshipEntity und @Relationship sowie zusätzlichen Parametern zu generieren. Ein Abfragegenerator wurde geschrieben, aber die Abfragezeichenfolge wurde zur Laufzeit berechnet und konnte nicht als Parameter der vorhandenen @Query Annotation verwendet werden. @Query wurde eine neue @CustomQuery Annotation hinzugefügt, deren Prozessor einen geschriebenen @CustomQuery verwendete.


Versionen der verwendeten Software:


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


Hinzufügen eines benutzerdefinierten Abfragegenerators zu Spring Data Neo4j


Um Ihren eigenen Mechanismus zum Generieren von Verschlüsselungsanforderungen für neo4j-Repository-Methoden hinzuzufügen, die beispielsweise mit der Annotation @CustomQuery , müssen @CustomQuery die CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory erstellen, die CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory und die Methode CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory neu definieren. Sie sollte eine neue Abfrageanalyse CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy


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

Es ist auch erforderlich, die Standardklasse Neo4jRepositoryFactoryBean neue Klasse CustomNeo4jRepositoryFactoryBean und die Methode CustomNeo4jRepositoryFactoryBean überschreiben. Es sollte eine Instanz der neuen Repository-Factory zurückgeben:


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

Damit Spring Data Neo4j versteht, welche Repository-Factory-Bean verwendet werden soll, muss dies in der Annotation @EnableNeo4jRepositories in der Konfiguration explizit angegeben werden:


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

Eine zusätzliche Annotation für CustomQuery Abfragen wurde CustomQuery . Wenn die Repository-Methode mit dieser Anmerkung gekennzeichnet ist, gibt CustomGraphQueryLookupStrategy in der Methode override resolveQuery das Objekt unserer Anforderung zurück. 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 implementiert eine getQuery Methode, die ein Query Objekt zurückgibt. Der Konstruktor akzeptiert eine Cypher-Abfrage, die in CustomGraphRepositoryQuery basierend auf den Daten aus der CustomQuery Annotation und dem mit dieser Annotation gekennzeichneten Method Objekt erstellt wurde:


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

Die Methode resolveParametres(Object[]) und resolveParametres(Object[]) die von ihr verwendet werden, sind in GraphRepositoryQuery , sodass sie einfach in CustomGraphRepositoryQuery kopiert CustomGraphRepositoryQuery (Sie können Reflection verwenden, dies hat keinen Einfluss auf die Leistung, da die Anforderungsgenerierung vor der Laufzeit erfolgt).


Fazit


Auf diese Weise können Sie bei Bedarf Ihren eigenen Mechanismus zum Generieren von Verschlüsselungsanforderungen deklarieren.


In den folgenden Artikeln werden der Abfragegenerator selbst, seine Parameter, der Arbeitsmechanismus, die aufgetretenen Probleme und ihre Lösung beschrieben.

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


All Articles