2015-01-17 5 views
5

मैं कस्टम व्यवहार के साथ एक स्प्रिंग डेटा जेपीए रिपोजिटरी बनाना चाहता हूं, और Specification एस का उपयोग करके उस कस्टम व्यवहार को लागू करना चाहता हूं। मैं इसे सेट अप करने के लिए Spring Data JPA documentation for implementing custom behavior in a single repository से गुज़र चुका हूं, सिवाय इसके कि कस्टम रिपॉजिटरी के भीतर से स्प्रिंग डेटा Specification का उपयोग करने का कोई उदाहरण नहीं है। यदि कोई भी संभव हो तो यह कैसे करेगा?स्प्रिंग डेटा जेपीए: विनिर्देशों के साथ कस्टम रिपोजिटरी व्यवहार को कार्यान्वित करना

मुझे कस्टम कार्यान्वयन में कुछ इंजेक्ट करने का कोई तरीका नहीं दिखता है जो एक विनिर्देश लेता है। मैंने सोचा कि मैं मुश्किल होगा और भंडार के सीआरयूडी भंडार हिस्से को कस्टम हिस्से में इंजेक्ट करूँगा, लेकिन इसके परिणामस्वरूप एक परिपत्र तत्काल निर्भरता हो सकती है।

मैं QueryDSL का उपयोग नहीं कर रहा हूं। धन्यवाद।

उत्तर

5

मुझे लगता है कि प्रेरणा के लिए प्राथमिक स्रोत SimpleJpaRepository विनिर्देशों को संभाल सकता है। कुंजी धब्बे देखने के लिए कर रहे हैं:

  • SimpleJpaRepository.getQuery(…) - यह मूल रूप से एक का चयन एक CriteriaQuery और बूटस्ट्रैप बनाने है एक जेपीए Root का उपयोग कर। चाहे बाद में आपके उपयोग के मामले पर लागू होता है, वह पहले से ही आपके ऊपर है। मुझे लगता है कि पूर्व निश्चित रूप से लागू होगा।
  • SimpleJpaRepository.applySpecificationToCriteria(…) - यह मूल रूप से कलाकृतियों getQuery(…) में उत्पादन का उपयोग करता है (अर्थात Root और CriteriaQuery) और वास्तव में इन कलाकृतियों के लिए लागू होता दिया Specification
2
इस

विशिष्टता, इसलिए ध्यान रखें, अगर यह आपके लिए प्रासंगिक है नहीं, लेकिन एक ही रास्ता है कि मैं कर रहा है के रूप में इस कस्टम व्यवहार इंजेक्षन करने में सक्षम था का उपयोग नहीं कर रहा है,

  1. बुनियादी संरचना:

    इस प्रकार

    i। इकाई वर्गों के सेट के लिए एक सामान्य इंटरफ़ेस बनाएं जो सामान्य जेनेरिक इकाई के बाद मॉडलिंग किए जाते हैं। नोट, यह वैकल्पिक है। मेरे मामले में मैं इस पदानुक्रम के लिए एक की जरूरत थी, लेकिन यह आवश्यक

    public interface GenericRepository<T> { 
    
    // add any common methods to your entity hierarchy objects, 
    // so that you don't have to repeat them in each of the children entities 
    // since you will be extending from this interface 
    } 
    

    ii नहीं है।

    public interface MySpecificEntityRepository extends GenericRepository<MySpecificEntity>, JpaRepository<MySpecificEntity, Long> { 
    
    // add all methods based on column names, entity graphs or JPQL that you would like to 
    // have here in addition to what's offered by JpaRepository 
    } 
    

    iii के रूप में सामान्य (चरण 1) और JPARepository से एक विशिष्ट भंडार बढ़ाएँ।

      आपकी सेवा कार्यान्वयन कक्षा में ऊपर भंडार का प्रयोग करें
    1. अब, सेवा वर्ग, कुछ ऐसा दिखाई देगा

      public interface GenericService<T extends GenericEntity, ID extends Serializable> { 
          // add specific methods you want to extend to user 
      } 
      
    2. सामान्य कार्यान्वयन वर्ग इस प्रकार हो सकता है,

      public abstract class GenericServiceImpl<T extends GenericEntity, J extends JpaRepository<T, Long> & GenericRepository<T>> implements GenericService<T, Long> { 
      
      // constructor takes in specific repository 
          public GenericServiceImpl(J genericRepository) { 
           // save this to local var 
          } 
          // using the above repository, specific methods are programmed 
      
      } 
      
    3. विशिष्ट कार्यान्वयन वर्ग हो सकता है

      public class MySpecificEntityServiceImpl extends GenericServiceImpl<MySpecificEntity, MySpecificEntityRepository> implements MySpecificEntityService { 
      
          // the specific repository is autowired 
          @Autowired 
          public MySpecificEntityServiceImpl(MySpecificEntityRepository genericRepository) { 
           super(genericRepository); 
           this.genericRepository = (MySpecificEntityRepository) genericRepository; 
          } 
      } 
      
संबंधित मुद्दे