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.