मुझे लगता है कि ऐसा करने का सबसे आसान तरीका तथाकथित प्रक्षेपण का उपयोग करना है। यह इंटरफेस के लिए क्वेरी परिणामों को मैप कर सकता है। उपयोग करना SqlResultSetMappingअनिर्वचनीय है और आपके कोड को बदसूरत बनाता है :)।
वसंत डेटा JPA स्रोत कोड से एक उदाहरण सही है:
public interface UserRepository extends JpaRepository<User, Integer> {
@Query(value = "SELECT firstname, lastname FROM SD_User WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
public static interface NameOnly {
String getFirstname();
String getLastname();
}
}
आप इस विधि का उपयोग अनुमानों की सूची प्राप्त करने के लिए भी कर सकते हैं।
अनुमानों के बारे में अधिक जानकारी के लिए इस स्प्रिंग डेटा जेपीए डॉक्स प्रविष्टि की जाँच करें।
नोट 1:
याद रखें कि आपकी Userइकाई को सामान्य के रूप में परिभाषित किया गया है - अनुमानित इंटरफ़ेस से फ़ील्ड इस इकाई में फ़ील्ड से मेल खाना चाहिए। अन्यथा फ़ील्ड मैपिंग को तोड़ा जा सकता है ( getFirstname()अंतिम नाम वगैरह का मान लौटा सकता है)।
नोट 2:
यदि आप SELECT table.column ...नोटेशन का उपयोग करते हैं, तो हमेशा इकाई से नाम मिलान करने वाले उपनामों को परिभाषित करें। उदाहरण के लिए यह कोड ठीक से काम नहीं करेगा (प्रक्षेपण प्रत्येक गटर के लिए नल लौटाएगा):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
लेकिन यह ठीक काम करता है:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
अधिक जटिल प्रश्नों के मामले में, मैं इसके बजाय JdbcTemplateकस्टम रिपॉजिटरी का उपयोग करना चाहूंगा ।