2012-03-16 12 views
5

मुझे पता है कि अगर यह एक @query एनोटेशन में सबक्वेरी करना संभव है चाहते हैं (org.springframework.data.jpa.repository.Query;)स्प्रिंगडाटा: क्या क्वेरी एनोटेशन में सबक्वायरी हो सकती है?

मैं पहली बार सबक्वेरी parentesis पर एक QuerySyntaxException हो रही है।

यहाँ मेरी क्वेरी

@Query(value="select c1 from ComplaintModel c1, " 
+ "(select c2.id, min(cb.termDate) minDate from ComplaintModel c2 " 
+ "join c2.complaintBullets cb join cb.status s where s.code = ?1 " 
+ "group by c2.id) tmp where c1.id = tmp.id order by tmp.minDate") 

धन्यवाद है!

+1

यह वसंत डेटा के बारे में नहीं है, मुझे विश्वास है कि आप इसे जेपीक्यूएल में भी नहीं कर सकते हैं। –

उत्तर

6

नहीं, जेपीक्यूएल क्वेरी में चयन खंड में सबक्वायरी संभव नहीं है।

जेपीक्यूएल WHERE और HAVING खंडों में उपक्विरी का समर्थन करता है। यह हो सकता है (कम से कम) कोई भी का हिस्सा है, कुछ, सभी, में, भाव मौजूद हैं, और निश्चित रूप से यह सामान्य सशर्त भाव इस्तेमाल किया जा सकता:

SELECT a 
FROM A a 
WHERE a.val = (SELECT b.someval 
       FROM B b 
       WHERE b.someotherval=3) 
0

@Query एनोटेशन की सामग्री के और अधिक या कम के रूप में पारित हो जाता है EntityManager.createQuery(…) पर कॉल करके दृढ़ता प्रदाता के लिए है। तो वहां जो भी अनुमति है उसे @Query में उपयोग किया जा सकता है। AFAIK, जेपीक्यूएल (जेपीए 2.0 के समय तक) केवल EXISTS और IN खंडों के लिए उपक्विरी का समर्थन करता है।

+0

जेपीए 2.0 WHERE और HAVING खंडों में उपक्विरी का समर्थन करता है। उन में उन्हें कई प्रकार के अभिव्यक्तियों में उपयोग किया जा सकता है, जिनमें EXISTS और IN शामिल हैं। –

1

मैंने किया था के साथ वसंत-डेटा जेपीए में होने की उम्मीद परिणाम प्राप्त

public final static String FIND_BY_ID_STATE = "SELECT a FROM Table1 a RIGHT JOIN a.table2Obj b " + 
               "WHERE b.column = :id" + 
               "AND a.id NOT IN (SELECT c.columnFromA from a.table3Obj c where state = :state)"; 


@Query(FIND_BY_ID_STATE) 
public List<Alert> findXXXXXXXX(@Param("id") Long id, @Param("state") Long state); 

जहां

Table2Obj & Table3Obj क्रमशः संस्थाओं Table1 और तालिका 2, Table3 के बीच के रिश्ते की मैपिंग कर रहे हैं।

नीचे जैसा परिभाषित किया गया है।

@OneToMany(mappedBy = "xxx", fetch = FetchType.LAZY) 
private Set<Table2> table2Obj = new HashSet<>(); 
संबंधित मुद्दे