Membuat Generator Permintaan Kustom di Data Musim Semi Neo4j (Bagian 1)

Untuk mulai dengan, tugas muncul untuk menghasilkan permintaan cypher untuk kelas data berdasarkan @NodeEntity , @RelationshipEntity dan @Relationship dan parameter tambahan. Generator kueri ditulis, tetapi string kueri dihitung dalam runtime dan kami tidak dapat menggunakannya sebagai parameter anotasi @Query ada, jadi anotasi @CustomQuery baru ditambahkan, prosesor yang menggunakan generator kueri tertulis.


Versi perangkat lunak yang digunakan:


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


Menambahkan generator kueri khusus ke Spring Data Neo4j


Untuk menambahkan mekanisme Anda sendiri untuk menghasilkan permintaan cypher untuk metode repositori neo4j yang ditandai, misalnya, dengan anotasi @CustomQuery , @CustomQuery perlu membuat kelas CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory dan mendefinisikan kembali metode getQueryLookupStrategy di dalamnya; itu harus mengembalikan kueri permintaanLebih tinggi permintaanLogic permintaanLebih lanjut permintaanLogik permintaanLebih CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy


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

Juga diperlukan untuk memperluas kelas Neo4jRepositoryFactoryBean standar Neo4jRepositoryFactoryBean kelas CustomNeo4jRepositoryFactoryBean baru dan mengganti metode createRepositoryFactory . Itu harus mengembalikan instance dari pabrik repositori baru:


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

Agar Spring Data Neo4j untuk memahami pabrik kacang repositori mana yang akan digunakan, itu harus secara eksplisit ditentukan dalam penjelasan @EnableNeo4jRepositories dalam konfigurasi:


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

Anotasi kueri CustomQuery tambahan telah CustomQuery . Jika metode repositori ditandai dengan anotasi ini, maka CustomGraphQueryLookupStrategy dalam metode resolveQuery ditimpa akan mengembalikan objek permintaan kami 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 mengimplementasikan metode getQuery yang mengembalikan objek Query , konstruktornya menerima kueri cypher yang dibangun di CustomGraphRepositoryQuery berdasarkan data dari anotasi CustomQuery dan objek Method ditandai dengan anotasi ini:


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

Metode resolveParametres(Object[]) dan resolveParametres(Object[]) digunakan olehnya bersifat pribadi di GraphRepositoryQuery , jadi mereka hanya disalin ke CustomGraphRepositoryQuery (Anda dapat menggunakan refleksi, ini tidak akan mempengaruhi kinerja, karena pembuatan permintaan terjadi sebelum runtime).


Kesimpulan


Dengan demikian, Anda dapat mendeklarasikan mekanisme Anda sendiri untuk menghasilkan permintaan cypher, jika perlu.


Artikel berikut akan menjelaskan pembuat kueri itu sendiri, parameternya, mekanisme kerja, masalah yang dihadapi dan solusinya.

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


All Articles