2015-10-28 4 views
9

क्वेरी (हाइबरनेट) में एकाधिक SELECT NEW स्टेटमेंट्स रखने का कोई तरीका है?एकाधिक चयन के साथ जेपीए कन्स्ट्रक्टर एक्सप्रेशन

यह मेरे लिए काम करता है:

@Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r) " 
     +" FROM Item g, Service s, Service l , Service r" 
     +" WHERE s.id = g.id" 
     +" AND s.location = l.name" 
     +" AND s.serviceType = 'type'" 
     +" AND l.serviceType = 'Location'" 
     +" AND l.area = r.name" 
     +" AND r.serviceType = 'Region'") 
public List<Item> getAllItemsWithServices(); 

मैं अपने DTO में अपेक्षित परिणाम मिलता है।

@Component 
public class ItemServiceDTO{ 

    private Item item; 
    private Service serviceType; 
    private Service serviceLocation; 
    private Service serviceRegion; 

    public ItemServiceDTO(item item, Service serviceType, Service serviceLocation, Service serviceRegion) { 
     super(); 
     this.item = item; 
     this.serviceType = serviceType; 
     this.serviceLocation = serviceLocation; 
     this.serviceRegion = serviceRegion; 
    } 

लेकिन क्या मैं चाहता हूँ अपने contructor साथ Language का एक नया उदाहरण है।

इस तरह उदाहरण के लिए:

@Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r), new LanguageDTO()" 
      +" FROM Item g, Service s, Service l , Service r" 

या ItemService

@Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r, new LanguageDTO())" 
       +" FROM Item g, Service s, Service l , Service r" 

मैं भी रुचि का एक subselect में Map और मेरे डीटीओ वस्तुओं में List का उपयोग करने में, लेकिन मैं thats संभव नहीं पढ़ा है? क्या वह सही है?

दो स्प्रिंग बूट एप्लिकेशन दो उदाहरणों का उपयोग करते समय त्रुटियों से शुरू होता है।

अंत में मैं चाहता हूँ Map<List<Item>,Map<List<LanguageDTO>,List<ItemServiceDTO>>> map;

+0

आपका जेपीए प्रदाता क्या है (यानी एक्लिप्ससेंक, हाइबरनेट)? – Ish

+0

क्षमा करें, इसकी हाइबरनेट – Patrick

+0

हैलो। मैं नए ऑपरेटर का उपयोग करने की कोशिश कर रहा हूं लेकिन थोड़ा संसाधन ढूंढ रहा हूं। प्रश्न: क्या आप एक जेपीए रेपो इंटरफ़ेस बनाते हैं और यह कथन देते हैं: सार्वजनिक सूची getAllItemsWithServices(); उस में रेपो? एक पूर्ण उदाहरण के लिए एक उदाहरण या संदर्भ की अत्यधिक सराहना की जाएगी। धन्यवाद – jscriptor

उत्तर

11

तकनीकी तौर पर की एक मानचित्र, JPQL चयन खंड के परिभाषा के द्वारा, यह कई निर्माता भाव की अनुमति होगी।

  • select_clause :: = का चयन करें [DISTINCT] select_expression {, select_expression} *
  • select_expression :: = single_valued_path_expression | aggregate_expression | पहचान_वर्तनीय |
    ऑब्जेक्ट (पहचान_वर्तनीय) | constructor_expression
  • constructor_expression :: = नया constructor_name (constructor_item {, constructor_item} *)
  • constructor_item :: = single_valued_path_expression | aggregate_expression
  • aggregate_expression :: = {AVG | MAX | मिन | एसयूएम} ([DISTINCT] state_field_path_expression) | COUNT ([DISTINCT]
    identification_variable | state_field_path_expression |
    single_valued_association_path_expression)

उदाहरण:

SELECT NEW com.test.model.UserName(u.firstname, u.lastname), NEW com.test.model.UserEmail(u.email) FROM User u 

हालांकि, मैं अभी पता चला कि हाइबरनेट यह अनुमति नहीं है। जब मैंने जेबए प्रदाता को हाइबरनेट से एक्लिप्ससेंक से स्विच किया, तो यह काम करता है। इसलिए, यदि आपको ऐसे क्वेरी सिंटैक्स की अनुमति है तो आपको अपने प्रदाता से परामर्श करने की आवश्यकता हो सकती है।

ध्यान दें कि, जब नए ऑपरेटर का उपयोग करते हैं, तो आपके कन्स्ट्रक्टर के पास तर्क (कम से कम एक) होना चाहिए।तो यह अभिव्यक्ति काम करेंगे नहीं:

SELECT NEW LanguageDTO() 

अपने दूसरे सवाल पर, चाहे वह उपयोग करने के लिए List और Map, मैं काफी उलझन में है कि कैसे आप अपने प्रश्न में इन संग्रहों का उपयोग करना चाहते हैं कर रहा हूँ संभव है। हालांकि, ध्यान दें कि JPQL SELECT_CLAUSE की परिभाषा के अनुसार आपके SELECT क्लॉज में संग्रहण मूल्यवान पथ अभिव्यक्तियां संभव नहीं है।

संबंधित मुद्दे