2013-11-02 11 views
11

हटाता है मेरे पास User इकाई और Role इकाई है। रिश्ते इस तरह परिभाषित किया गया है:वसंत डेटा जेपीए मूल क्वेरी फेंकने अपवाद

@OneToMany 
@JoinTable(name="USER_ROLES", [email protected](name="ROLE_ID")) 
private List<Role> roles = null; 

अब, जब मैं एक भूमिका हटाने के लिए, मेरे पास है कि उस भूमिका सभी उपयोगकर्ताओं से भूमिका को हटाने के लिए की जरूरत है। आम तौर पर आप इस भूमिका के साथ सभी उपयोगकर्ताओं को देखकर, सूची से भूमिका को हटाने और उपयोगकर्ता को सहेजकर ऐसा कुछ करेंगे। हालांकि, जब दस लाख से अधिक उपयोगकर्ता हो सकते हैं, तो मैं ऐप में इस कई इकाइयों पर लूप नहीं करना चाहता हूं। इसलिए, मैं USER_ROLES तालिका में पंक्तियों को हटाने के लिए मूल क्वेरी का उपयोग करना चाहता हूं। मैं अपने भंडार को यह जोड़ने की कोशिश की:

@Query(value="DELETE FROM user_roles WHERE role_id = ?1", nativeQuery=true) 
public void deleteRoleFromUsersWithRole(Long roleId); 

हालांकि, जब मैं यह कर, मैं लॉग में निम्न देखें:

[EL Fine]: sql: 2013-11-02 14:27:14.418--ClientSession(707349235)--Connection(2096606500)--Thread(Thread[http-bio-8080-exec-4,5,main])--DELETE FROM user_roles WHERE role_id = ? 
    bind => [1000110139999999953] 
[EL Fine]: sql: 2013-11-02 14:27:14.478--ClientSession(707349235)--Thread(Thread[http-bio-8080-exec-4,5,main])--SELECT 1 
[EL Warning]: 2013-11-02 14:27:14.482--UnitOfWork(1795045370)--Thread(Thread[http-bio-8080-exec-4,5,main])--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: org.postgresql.util.PSQLException: No results were returned by the query. 
Error Code: 0 
Call: DELETE FROM user_roles WHERE role_id = ? 
    bind => [1000110139999999953] 
Query: DataReadQuery(sql="DELETE FROM user_roles WHERE role_id = ?") 

मुझे समझ नहीं आता No results were returned by the query. क्या कह रहा है। रिकॉर्ड डेटाबेस से हटा दिया जाता है, लेकिन यह अपवाद सबकुछ उड़ा रहा है।

क्या कोई मुझे बता सकता है कि मैं यहां क्या कर रहा हूं?

उत्तर

26

डेटाबेस से पढ़ने के लिए @Query के साथ एनोटेटेड विधि एक क्वेरी निष्पादित करती है। डेटाबेस को अपडेट नहीं करना है। कि, के रूप में the documentation संकेत दिया, आप विधि के लिए @Modifying एनोटेशन जोड़ने की जरूरत है ऐसा करने के लिए:

उपरोक्त सभी वर्गों एक दिया इकाई या इकाइयों के संग्रह का उपयोग करने के प्रश्नों घोषित करने के लिए कैसे का वर्णन। बेशक आप धारा 1.3, "स्प्रिंग डेटा भंडार के लिए कस्टम कार्यान्वयन" में वर्णित सुविधाओं का उपयोग करके कस्टम संशोधित व्यवहार जोड़ सकते हैं। चूंकि यह दृष्टिकोण व्यापक कस्टम कार्यक्षमता के लिए व्यवहार्य है, इसलिए आप संशोधित प्रश्नों के निष्पादन को निष्पादित कर सकते हैं जो वास्तव में केवल @ मोडिफाइंग:

उदाहरण 2.13 के साथ क्वेरी विधि को एनोटेट करके पैरामीटर बाध्यकारी की आवश्यकता है। घोषणा छेड़खानी प्रश्नों

@Modifying 
@Query("update User u set u.firstname = ?1 where u.lastname = ?2") 
int setFixedFirstnameFor(String firstname, String lastname); 

इस क्वेरी क्वेरी को अद्यतन करने के बजाय एक एक का चयन के रूप में विधि के लिए एनोटेट ट्रिगर किया जाएगा।

+4

आह, मैं अभी भी वसंत डेटा और जेपीए के लिए काफी नया हूं। मुझे लगता है मुझे दस्तावेज़ों में अधिक समय बिताना चाहिए। मुझे ध्यान रखना चाहिए कि इसे काम करने के लिए मुझे '@ ट्रांजेक्शनल' एनोटेशन भी जोड़ना पड़ा। आपकी सहायता के लिए धन्यवाद. – dnc253

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