में एक चरम बनाम एक चरम बनाम पैरामीटर एक्सप्रेशन का उपयोग करते हुए जेपीए मानदंड एपीआई का उपयोग करते समय, एक चर पर पैरामीटर एक्सप्रेशन का उपयोग करने का क्या फायदा है? जैसे जब मैं एक स्ट्रिंग वैरिएबल में नाम से ग्राहक की खोज करना चाहते हैं, मैं मानकों के साथ की तरहजेपीए मानदंड एपीआई
private List<Customer> findCustomer(String name) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Customer> criteriaQuery = cb.createQuery(Customer.class);
Root<Customer> customer = criteriaQuery.from(Customer.class);
criteriaQuery.select(customer).where(cb.equal(customer.get("name"), name));
return em.createQuery(criteriaQuery).getResultList();
}
कुछ लिख सकता है यह हो जाता है:
private List<Customer> findCustomerWithParam(String name) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Customer> criteriaQuery = cb.createQuery(Customer.class);
Root<Customer> customer = criteriaQuery.from(Customer.class);
ParameterExpression<String> nameParameter = cb.parameter(String.class, "name");
criteriaQuery.select(customer).where(cb.equal(customer.get("name"), nameParameter));
return em.createQuery(criteriaQuery).setParameter("name", name).getResultList();
}
संक्षिप्तता के लिए मैं विशेष रूप से जब, पहला तरीका पसंद करेंगे क्वेरी वैकल्पिक पैरामीटर के साथ अधिक हो जाता है। एसक्यूएल इंजेक्शन की तरह इस तरह के पैरामीटर का उपयोग करने के कोई नुकसान हैं?
मैं सामान्य रूप में जेपीए के लिए नहीं बोल सकता बनाने , लेकिन मुझे पता चला कि ओपनजेपीए आंतरिक रूप से एक मानदंड क्वेरी को जेपीक्यूएल में परिवर्तित करता है और इसे ओपनजेपीए-विशिष्ट कार्यक्षमता का उपयोग करके मुद्रित किया जा सकता है (देखें p: //openjpa.apache.org/builds/2.1.1/apache-openjpa/docs/ch13s03.html)। पहली क्वेरी "ग्राहक सी से चुनें सी WHERE c.name = 'test ग्राहक'" का अनुवाद करती है। इसका अर्थ यह है कि यह पैरामीटर का उपयोग नहीं करता है, इसलिए अगर इसे SQL में आगे अनुवादित किया जाता है तो संबंधित तैयार कथन पैरामीटर का उपयोग नहीं करेगा। दूसरा संस्करण जेपीक्यूएल में अनुवाद करता है "ग्राहक सी से चुनें सी WHERE c.name =: name", इसलिए मैं पैरामीटर का उपयोग करूंगा। –
कुछ और परीक्षणों के बाद मैंने पाया कि जेपीक्यूएल के साथ एक ही प्रश्न लिखना और नाम '' या 'x' = 'x' का उपयोग करके जेपीक्यूएल इंजेक्ट करता है। मानदंड API का उपयोग करते समय, उत्पन्न जेपीक्यूएल जो ओपनजेपीए लॉग बिल्कुल दिखता है। हालांकि ओपनजेपीए द्वारा लॉग इन किया गया वास्तविक एसक्यूएल जेपीक्यूएल मामले में '' 'या' x '=' x 'के पैरामीटर के साथ एक तैयार कथन का उपयोग करता है।इसका मतलब है कि एसक्यूएल इंजेक्शन यहां काम नहीं करता है! दुर्भाग्य से मुझे नहीं पता कि यह कितना विश्वसनीय है। ऐसा लगता है कि यह एक अनियंत्रित सुविधा है। –
युक्ति: मैंने अभी http://www.querydsl.com/ को आज़माया है और यह वाक्यविन्यास बहुत संक्षिप्त और पठनीय है। ऐसा लगता है कि डिफ़ॉल्ट रूप से पैरामीटर का उपयोग करके एसक्यूएल इंजेक्शन के खिलाफ सुरक्षा होती है। –