2016-08-19 6 views
5

official documentation के बाद उन्नत तुलनित्र, मेरे स्प्रिंग विन्यास को @EnableSpringDataWebSupport एनोटेशन जोड़ने स्वचालित रूप से क्वेरी में एक Predicate वर्ग इंजेक्षन करने की अनुमति देतावसंत के लिए QueryDsl समर्थन

GET /foo/name?=bob&name=alice&age=20 

यह ठीक काम करता है। हालांकि मैं सोच रहा था कि कैसे और अधिक उन्नत खोज मापदंड को प्राप्त करने:

  • >
  • <
  • >=
  • <=

आमतौर पर मैं सांख्यिक और तिथि खाने के लिए इन ऑपरेटरों लागू करना चाहते हैं मेरे डेटा मॉडल में। Querydsl में इस तरह के मानदंड समर्थित हैं।

मैं अपने क्वेरी पैरामीटर में > (%3E) जोड़ने की कोशिश की लेकिन यह उम्र की तरह संख्यात्मक फ़ील्ड के लिए (उदाहरण के लिए पार्स करने में विफल यह शिकायत है कि यह एक संख्या के रूप में >10 पार्स नहीं कर सकता।

क्या यह संभव है क्वेरी में सीधे इस ऑपरेटर का उपयोग करने के लिए?

(मामले में यह मायने रखती है मैं वसंत डाटा MongoDB उपयोग कर रहा हूँ)

+0

क्या आपको कभी इसे लागू करने का कोई तरीका मिला?मैं कुछ समान लागू करने की कोशिश कर रहा हूं, लेकिन बिना किसी सफलता के। – woemler

+1

@woemler मैंने वास्तव में उस मुद्दे को वास्तव में पार्क किया है लेकिन यह दूर नहीं जा रहा है। मुझे लगता है कि मैं क्वेरी पैरामीटर पार्स करने के लिए अपना कोड लिखना समाप्त कर दूंगा। मुझे यह जांचने की ज़रूरत है कि वसंत इंजेक्शन तंत्र के साथ इसे एकीकृत करने का कोई आसान तरीका है या नहीं। जब मैं ऐसा करता हूं तो मैं शायद वसंत गीथब भंडार पर सलाह मांगूंगा। यदि मुझे कुछ रोचक – phoenix7360

उत्तर

1

कस्टम क्वेरी डीएसएल बंधन - तुलना से अधिक

क्या आप QueryDslPredicateExecutor और QuerydslBinderCustomizer बढ़ा कर परिभाषित किया जाता है अपने स्वयं के QueryDSL अपने भंडार में बाइंडिंग, कर सकते हैं:

public interface FooRepository 
     extends CrudRepository<Foo, Integer>, QueryDslPredicateExecutor<Foo>, QuerydslBinderCustomizer<QFoo> { 

    default void customize(final QuerydslBindings bindings, final QFoo foo) { 
     SingleValueBinding<NumberPath<Integer>, Integer> singleBinding = new SingleValueBinding<NumberPath<Integer>,Integer>(){ 
      @Override 
      public Predicate bind(NumberPath<Integer> path, Integer ageValue) { 
       return path.gt(ageValue); 
      } 
     }; 

     bindings.bind(foo.age).first(singleBinding); 
    } 
} 

मैं, कोई क्वेरी डीएसएल विशेषज्ञ हूँ, लेकिन मेरी समझ निम्नलिखित है:

एक बाध्यकारी परिभाषित करता है कि डेटाबेस कॉलम से एक विशिष्ट फ़ील्ड की तुलना कैसे की जाती है।

जावा 8 लैम्ब्डा के साथ समान बाध्यकारी: (path, ageValue) -> path.gt(ageValue)। आप url पैरामीटर के नजरिए से अनुकूलित विधि में कोड को पढ़ने के लिए:

Foos जिसके लिए पैरामीटर के रूप में प्रदान की आयु से अधिक डेटाबेस का मूल्य है लाने।

कस्टम क्वेरी डीएसएल बंधन - तुलना के बीच

एक अन्य विकल्प कम करने और अपने पैरामीटर के लिए ऊपरी सीमा प्रदान करने के लिए, इस तरह है: ?age=10&age=30। फिर, निम्नलिखित बाध्यकारी परिभाषित करें:

default void customize(final QuerydslBindings bindings, final QFoo foo) { 
    bindings.bind(foo.age).all((path, ageValue) -> { 
     Iterator<? extends Long> it = value.iterator(); 
     return path.between(it.next(), it.next()); 
    }); 
} 
+0

कुछ दिलचस्प लगता है तो इसे यहां उत्तर के रूप में लिखूंगा। एकमात्र समस्या यह है कि यह अभिव्यक्ति के वास्तविक विश्लेषण को अनुकूलित करने की अनुमति नहीं देता है। डेटाटाइप सेट करने के तरीके के कारण, एक int फ़ील्ड होना संभव नहीं है लेकिन स्ट्रिंग को पार्स करें (उदाहरण के लिए ">")। यह वसंत की एक सीमा प्रतीत होता है। – phoenix7360

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