स्प्रिंग डेटा Neo4j में एक कस्टम क्वेरी जनरेटर बनाना (भाग 1)

शुरू करने के लिए, कार्य @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 (आप प्रतिबिंब का उपयोग कर सकते हैं, यह प्रदर्शन को प्रभावित नहीं करेगा, क्योंकि क्वेरी पीढ़ी रनटाइम से पहले होती है)।


निष्कर्ष


इस प्रकार, यदि आवश्यक हो, तो आप साइबर अनुरोध उत्पन्न करने के लिए अपने स्वयं के तंत्र की घोषणा कर सकते हैं।


निम्नलिखित लेख स्वयं क्वेरी जनरेटर, इसके मापदंडों, काम के तंत्र, सामना की गई समस्याओं और उनके समाधान का वर्णन करेंगे।

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


All Articles