मैं पैरामीट्रिज्ड ऑर्डर करने के लिए संघर्ष कर रहा हूं। सबसे अच्छा होगा

... order by :orderColumn :orderDirection ...

क्या मुड़ना भी संभव है:

    @Query("select * from Document where folderId = :folderId AND documentType = :documentType"
            + " order by created desc limit :limit")
    List<Document> findByFolderIdAndDocumentTypeOrderByWithLimit(Long folderId, String documentType,
                                                                     String orderColumn, Integer limit);

में:

    @Query("select * from Document where folderId = :folderId AND documentType = :documentType"
            + " order by :orderColumn desc limit :limit")
    List<Document> findByFolderIdAndDocumentTypeOrderByWithLimit(Long folderId, String documentType,
                                                                     String orderColumn, Integer limit);

मैं वसंत-डेटा-jdbc 1.1.3.REELASE संस्करण का उपयोग कर रहा हूँ। यहां तक ​​​​कि इसे सिर्फ कॉलम नाम के लिए करने से मुझे बहुत मदद मिलेगी।

3
ppysz 23 फरवरी 2020, 14:32

3 जवाब

PagingAndSortingRepository का प्रयोग करें

  @Query("select * from Document where folderId = :folderId AND documentType = :documentType")
    List<Document> findByFolderIdAndDocumentTypeOrderByWithLimit(Long folderId, String documentType, Pageable pageable);

और विधि को कॉल करें:

findByFolderIdAndDocumentTypeOrderByWithLimit(1,"Type", PageRequest.of(0, <limit>, Sort.by(<column name>).descending());

उदाहरण के लिए आप यहां ठीक कर सकते हैं

2
Jens 23 फरवरी 2020, 14:45
हाँ, लेकिन यह jpa के लिए है :( जहाँ तक मुझे पता है कि स्प्रिंग-डेटा-jdbc 2.0.0 में इसका उपयोग करने की क्षमता प्रदान करेगा डायन अब M2 में है। मुझे रिलीज़ संस्करण का उपयोग करना होगा। 1.XXRELEASE संस्करणों में पेजेबल ऑब्जेक्ट पास करना एपीआई द्वारा अनुमत है लेकिन रनटाइम में अनदेखा किया गया है;/
 – 
ppysz
23 फरवरी 2020, 14:52

कॉलम नाम को बाइंड पैरामीटर से बदलना संभव नहीं है। यह JDBC की एक सीमा है, और संभवतः SQL की भी।

आप क्या कर सकते हैं एक अभिव्यक्ति का उपयोग करें जो बाइंड पैरामीटर के आधार पर विभिन्न कॉलम के मान का मूल्यांकन करता है। कुछ इस तरह

... ORDER BY CASE
    WHEN :orderColumn = 'created' THEN created
    WHEN :orderColumn = 'updated' THEN updated
    WHEN :orderColumn = 'deleted' THEN deleted
    ELSE 1
END;

ध्यान दें कि इस प्रकार का निर्माण क्वेरी ऑप्टिमाइज़र द्वारा अच्छी तरह से समर्थित नहीं है और इसलिए किसी भी इंडेक्स का उपयोग नहीं करेगा जो अन्यथा लागू होगा।

यदि आपको अनुकूलक द्वारा बेहतर समर्थन की आवश्यकता है तो आप हमेशा एक कस्टम क्वेरी लिख सकते हैं जिसे आप गतिशील रूप से बनाते हैं। यदि आप ऐसा करने का निर्णय लेते हैं, तो सुनिश्चित करें कि आप SQL इंजेक्शन कमजोरियों से बचने के लिए अपने SQL कथन में अविश्वसनीय स्रोतों से स्ट्रिंग्स को शामिल नहीं करते हैं।

2
Jens Schauder 24 फरवरी 2020, 09:44

जब तक spring-data-jdbc (जहाँ तक मुझे पता है 2.X.X.RELEASE) का संस्करण नहीं होगा, जो Pagable ऑब्जेक्ट का समर्थन करता है, मैंने इस विशेष मामले के लिए NamedParameterJdbcTemplate का उपयोग करने का निर्णय लिया है और अपनी क्वेरी को पूंछा है। मुझे आशा है कि यह या अन्य उत्तर यहां किसी की मदद करेंगे। आपके सहयोग के लिए धन्यवाद :)

0
ppysz 13 मार्च 2020, 13:37