2016-03-04 5 views
9

मैं एप्लिकेशन माइग्रेट करने का प्रयास कर रहा हूं। मैं से स्प्रिंग डेटा जेपी पर हाइबरनेट से काम कर रहा हूं।वसंत डेटा जेपीए - विधि नाम के माध्यम से एकाधिक और और या कैसे गठबंधन करें

हालांकि वसंत डेटा जेपीए क्वेरी बिल्डिंग के लिए सरल तरीकों की पेशकश करता है, मैं क्वेरी विधि बनाने में फंस गया हूं जो And और Or operator दोनों का उपयोग करता है।

methodName - findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)

जब यह क्वेरी में धर्मान्तरित, पहले दो भाव जोड़ दिया जाता है और यह [(exp1 and exp2) or (exp3)] के रूप में निष्पादित करता है।

जबकि आवश्यक ](exp1) and (exp2 or exp3)] है।

किसी को भी मुझे पता है कि अगर यह Spring data jpa?

उत्तर

2

के माध्यम से प्राप्त है Option1 जाने कर सकते हैं करें: आप नामित-प्रश्नों इस्तेमाल कर सकते हैं (Using JPA Named Queries देखें):

@Entity 
@NamedQuery(name = "User.findByEmailAddress", 
    query = "select u from User u where u.emailAddress = ?1") 
public class User { 

} 

public interface UserRepository extends JpaRepository<User, Long> { 

    User findByEmailAddress(String emailAddress); 
} 

Option2: @Query का उपयोग लिखने के लिए आपके कस्टम प्रश्न (Using @Query देखें)

public interface UserRepository extends JpaRepository<User, Long> { 

    @Query("select u from User u where u.emailAddress = ?1") 
    User findByEmailAddress(String emailAddress); 
} 
+0

उत्तर के लिए धन्यवाद! NamedQuery या क्वेरी का उपयोग करने का एकमात्र नुकसान यह है कि जब कक्षा एक ही रेपो कक्षा में एकाधिक प्रश्न पूछती है तो कक्षा इतनी गन्दा लगती है :( –

+0

लेकिन फिर, आपके विधि-नाम गन्दा दिखने लगते हैं और पढ़ने में मुश्किल हो जाते हैं विधि-नाम से पूछताछ सरल प्रश्नों के लिए सुविधाजनक है - किसी बिंदु पर आपको '@ क्वेरी' पर स्विच करना चाहिए। – fateddy

1

यह वर्तमान में संभव नहीं है और भविष्य में भी नहीं होगा। मैं तर्क दूंगा कि यहां तक ​​कि यदि यह संभव हो, तो एक और जटिल क्वेरी के साथ आप कृत्रिम रूप से विधि नाम में सभी क्वेरी जटिलता को निचोड़ नहीं करना चाहेंगे। न केवल इसलिए कि क्वेरी में वास्तव में क्या चल रहा है, उसे पचाना मुश्किल हो जाता है लेकिन क्लाइंट कोड बिंदु से भी: आप अभिव्यक्तिपूर्ण विधि नामों का उपयोग करना चाहते हैं, जो कि सरल findByUsername(…) के मामले में - क्वेरी व्युत्पन्न आपको बनाने की अनुमति देता है।

अधिक जटिल सामान के लिए आप सिर्फ क्वेरी जटिलता बुला कोड में तरक्की और यह बजाय एक पठनीय विधि नाम शब्दार्थ व्यक्त करता है कि क्या क्वेरी करता है पर ले जाने और या तो @Query का उपयोग कर एक मैन्युअल रूप से घोषित क्वेरी में क्वेरी जटिलता रखने के लिए सलाह दी जाती है, नामित प्रश्न या पसंद है।

6

लंबी और अपठनीय विधि के नाम पर ओलिवर के साथ सहमत, लेकिन फिर भी और तर्क की खातिर, आप अपने मामले में समानक का उपयोग कर

A /\ (B \/ C) <=> (A /\ B) \/ (A /\ C) 
A and (B or C) <=> (A and B) or (A and C) 

तो यह कुछ इस तरह देखना चाहिए द्वारा वांछित परिणाम प्राप्त कर सकते हैं: findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs (...)

+0

यह मूल रूप से काम करता है - हालांकि: दृष्टिकोण के साथ डुप्लिकेट चर से कैसे बचें? (यदि संभव हो तो सब ....) – Trinimon

+0

हाँ, यह काम करता है ... ऐसा लगता है कि आप डुप्लीकेट पैरामीटर से बच नहीं सकते हैं। मैंने अजीब विधि हस्ताक्षर को छिपाने के लिए एक मुखौटा विधि का उपयोग किया – kiedysktos

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