بادئ ذي بدء ، نشأت المهمة لإنشاء طلبات @NodeEntity
لفئات البيانات استنادًا إلى @Relationship
و @Relationship
و @Relationship
والمعلمات الإضافية. تمت كتابة منشئ الاستعلام ، ولكن تم حساب سلسلة الاستعلام في وقت التشغيل ولم نتمكن من استخدامها كمعلمة @Query
التوضيحي الحالي @Query
، لذلك تمت إضافة تعليق توضيحي جديد @CustomQuery
، استخدم المعالج @CustomQuery
استعلام مكتوب.
إصدارات البرامج المستخدمة:
spring-data-neo4j - 5.0.9.RELEASE
neo4j - 3.4.6
neo4j-ogm - 3.1.4
إضافة مولد استعلام مخصص إلى Spring Data Neo4j
لإضافة آليتك الخاصة لإنشاء طلبات cypher لطرق مستودع neo4j المميزة ، على سبيل المثال ، مع التعليق التوضيحي @CustomQuery
، تحتاج إلى إنشاء CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory
تعريف استعلام CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy
@Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(QueryLookupStrategy.Key key, EvaluationContextProvider evaluationContextProvider) { return Optional.of(new CustomGraphQueryLookupStrategy(session)); }
من الضروري أيضًا توسيع فئة Neo4jRepositoryFactoryBean
القياسية Neo4jRepositoryFactoryBean
فئة CustomNeo4jRepositoryFactoryBean
الجديدة وتجاوز طريقة createRepositoryFactory
. يجب أن يعيد مثيل مصنع المستودع الجديد:
@Override protected RepositoryFactorySupport createRepositoryFactory(Session session) { return new CustomNeo4jRepositoryFactory(session); }
لجعل Spring Data Neo4j يفهم أي من فاصوليا مستودع التخزين المراد استخدامه ، يجب تحديده بشكل صريح في التعليق التوضيحي @EnableNeo4jRepositories
في التكوين:
@EnableNeo4jRepositories(..., repositoryFactoryBeanClass = CustomNeo4jRepositoryFactoryBean.class)
تم CustomQuery
تعليق توضيحي استعلام CustomQuery
إضافي. إذا تم وضع علامة على طريقة مستودع التخزين مع هذا التعليق التوضيحي ، CustomGraphQueryLookupStrategy
في الأسلوب resolveQuery
بإرجاع كائن طلبنا 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); } }
يطبق getQuery
أسلوب getQuery
يُرجع كائن Query
؛ يقبل مُنشئه استعلام CustomGraphRepositoryQuery
الذي تم إنشاؤه في CustomGraphRepositoryQuery
استنادًا إلى البيانات من تعليق توضيحي CustomQuery
Method
المميز بهذا التعليق التوضيحي:
@Override protected Query getQuery(Object[] parameters) { return new Query(query, resolveParams(parameters)); }
resolveParametres(Object[])
وطريقة resolveParametres(Object[])
المستخدمة من GraphRepositoryQuery
خاصة في GraphRepositoryQuery
، لذلك تم نسخهم ببساطة إلى CustomGraphRepositoryQuery
(يمكنك استخدام الانعكاس ، لن يؤثر هذا على الأداء ، لأن توليد الاستعلام يحدث قبل وقت التشغيل).
الخاتمة
وبالتالي ، يمكنك إعلان الآلية الخاصة بك لإنشاء طلبات cypher ، إذا لزم الأمر.
سوف تصف المقالات التالية منشئ الاستعلام نفسه ، ومعلماته ، وآلية عمله ، والمشاكل التي واجهتها وحلها.