शुरू करने के लिए, कार्य @NodeEntity
, @RelationshipEntity
और @Relationship
और अतिरिक्त मापदंडों के आधार पर डेटा कक्षाओं के लिए @NodeEntity
अनुरोध उत्पन्न करने के लिए उत्पन्न हुआ। एक क्वेरी जनरेटर लिखा गया था, लेकिन @Query
में क्वेरी स्ट्रिंग की गणना की गई थी और हम इसे मौजूदा @Query
एनोटेशन के पैरामीटर के रूप में उपयोग नहीं कर सकते थे, इसलिए एक नया @CustomQuery
एनोटेशन जोड़ा गया था, जिसके प्रोसेसर ने एक लिखित क्वेरी जनरेटर का उपयोग किया था।
प्रयुक्त सॉफ्टवेयर के संस्करण:
स्प्रिंग-डेटा-नियो 4 जे - 5.0.9
neo4j - 3.4.6
neo4j-ogm - 3.1.4
स्प्रिंग डेटा Neo4j में एक कस्टम क्वेरी जनरेटर जोड़ना
Neo4j रिपॉजिटरी तरीकों के लिए साइबर अनुरोध उत्पन्न करने के लिए अपना स्वयं का तंत्र जोड़ने के लिए, उदाहरण के लिए, @CustomQuery
एनोटेशन के साथ, @CustomQuery
CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory
बनाने के लिए CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory
और इसमें getQueryLookupStrategy
विधि को फिर से परिभाषित करना होगा; इसे एक नई क्वेरी वापस करनी चाहिए।
@Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(QueryLookupStrategy.Key key, EvaluationContextProvider evaluationContextProvider) { return Optional.of(new CustomGraphQueryLookupStrategy(session)); }
नए CustomNeo4jRepositoryFactoryBean
वर्ग के Neo4jRepositoryFactoryBean
मानक Neo4jRepositoryFactoryBean
वर्ग का विस्तार करना और createRepositoryFactory
विधि को ओवरराइड करना भी आवश्यक है। इसे नई रिपॉजिटरी फैक्ट्री का एक उदाहरण देना चाहिए:
@Override protected RepositoryFactorySupport createRepositoryFactory(Session session) { return new CustomNeo4jRepositoryFactory(session); }
स्प्रिंग डेटा Neo4j के लिए यह समझने के लिए कि कौन से रिपॉजिटरी फैक्ट्री बीन का उपयोग करना है, यह स्पष्ट रूप से कॉन्फ़िगरेशन में @EnableNeo4jRepositories
एनोटेशन में निर्दिष्ट होना चाहिए:
@EnableNeo4jRepositories(..., repositoryFactoryBeanClass = CustomNeo4jRepositoryFactoryBean.class)
एक अतिरिक्त CustomQuery
क्वेरी एनोटेशन CustomQuery
किया गया है। यदि इस एनोटेशन के साथ रिपॉजिटरी विधि को चिह्नित किया जाता है, तो ओवरराइड किए गए resolveQuery
विधि में 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); } }
CustomGraphRepositoryQuery
एक Query
ऑब्जेक्ट लौटाता है एक getQuery
विधि लागू करता है; इसका निर्माण एक getQuery
Query
स्वीकार करता है जो CustomQuery
में CustomQuery
एनोटेशन और इस एनोटेशन के साथ चिह्नित Method
ऑब्जेक्ट के डेटा के आधार पर बनाया गया था:
@Override protected Query getQuery(Object[] parameters) { return new Query(query, resolveParams(parameters)); }
इसके द्वारा resolveParametres(Object[])
की जाने वाली resolveParametres(Object[])
विधि और resolveParametres(Object[])
GraphRepositoryQuery
में निजी हैं, इसलिए उन्हें बस CustomGraphRepositoryQuery
(आप प्रतिबिंब का उपयोग कर सकते हैं, यह प्रदर्शन को प्रभावित नहीं करेगा, क्योंकि क्वेरी पीढ़ी रनटाइम से पहले होती है)।
निष्कर्ष
इस प्रकार, यदि आवश्यक हो, तो आप साइबर अनुरोध उत्पन्न करने के लिए अपने स्वयं के तंत्र की घोषणा कर सकते हैं।
निम्नलिखित लेख स्वयं क्वेरी जनरेटर, इसके मापदंडों, काम के तंत्र, सामना की गई समस्याओं और उनके समाधान का वर्णन करेंगे।