3.1 परिचय

एक अन्य उपयोगी चीज जिसके बारे में मैं बात करना चाहूंगा वह है NativeQuery । जैसा कि आप पहले से ही जानते हैं, NativeQuery का उपयोग करके, आप मूल SQL में क्वेरी लिख सकते हैं। हालाँकि, और भी दिलचस्प बात यह है कि क्वेरी परिणाम प्राप्त करते समय आपको क्लास मैपिंग का उपयोग करने की आवश्यकता नहीं है।

मैं आपको एक उदाहरण दिखाना चाहता हूं:

List<Object[]> persons = session.createNativeQuery("SELECT * FROM Person").list();

इस उदाहरण में, हम एक वर्ग पास नहीं करते हैं जो क्वेरी परिणाम पंक्तियों से मेल खाता है, इसके बजाय हम ऑब्जेक्ट ऑब्जेक्ट्स की एक सरणी का उपयोग करते हैं।

यह उपयोगी हो सकता है यदि आप तालिका में केवल कुछ स्तंभों का चयन करना चाहते हैं। उदाहरण:


List<Object[]> persons = session.createNativeQuery("SELECT id, name FROM Person").list();
 
for(Object[] person : persons) {
    Number id = (Number) person[0];
    String name = (String) person[1];
}

जब आप एक ResultSet ऑब्जेक्ट प्राप्त करते हैं और इसकी पंक्तियों से डेटा पढ़ते हैं, तो यह कुछ हद तक JDBC दृष्टिकोण के समान होता है।

हालाँकि, हाइबरनेट इसे और अधिक विश्वसनीय बनाने के लिए अलग-अलग तरीके प्रदान करता है। उदाहरण के लिए, आप उन स्तंभों के प्रकार को निर्दिष्ट कर सकते हैं जिन्हें आप घटाना चाहते हैं। उदाहरण:


Query<Object[]> query = session.createNativeQuery("SELECT id, name FROM Person");
query.addScalar("id", StandardBasicTypes.LONG);
query.addScalar("name", StandardBasicTypes.STRING);
List<Object[]> persons = query.list();
 
for(Object[] person : persons) {
    Long id = (Long) person[0];
    String name = (String) person[1];
}

3.2 इकाई मानचित्रण

आप स्पष्ट रूप से उस वर्ग को भी निर्दिष्ट कर सकते हैं जिसका उपयोग नेटिवक्वेरी के परिणाम को पार्स करते समय हाइबरनेट को करना चाहिए । यह अलग-अलग तरीकों से किया जा सकता है।


Query<Person> query = session.createNativeQuery("SELECT * FROM Person")
    .addEntity(Person.class);
    .list();

और हां, अच्छा पुराना प्रारूप जिसे आप जानते हैं:


Query<Person> query = session.createNativeQuery("SELECT * FROM Person", Person.class).list();

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

वैसे, इसके दृष्टिकोण के लिए धन्यवाद, हाइबरनेट आपको एक वर्ग को क्वेरी परिणाम मैपिंग से नहीं, बल्कि कई वर्गों से जोड़ने की अनुमति देता है। उदाहरण:


List<Phone> results = session.createNativeQuery(
    "SELECT {ph.*}, {pr.*}" +
    "FROM Phone ph" +
    "JOIN Person pr ON ph.person_id = pr.id")
.addEntity("ph", Phone.class)
.addJoin("pr", "ph.person")
.list();
 
for (Phone. phone : results) {
           	assertNotNull( phone.getPerson().getName() );
}

डेटाबेस से डेटा के चयन को गति देने के लिए नेटिवक्वेरी का उपयोग करने वाले इस दृष्टिकोण का उपयोग किया जा सकता है। यदि आप जानते हैं कि आपको कुछ स्तंभों की आवश्यकता नहीं है, तो आप उन्हें अनुरोध में छोड़ सकते हैं।

आप सभी बाल संस्थाओं को एक साथ लोड कर सकते हैं, भले ही हाइबरनेट कैशे या लेज़ीलोडिंग तंत्र का उपयोग करना चाहता हो । इसके अतिरिक्त, आपकी बाल संस्थाओं के डेटाबेस में कई कॉलम हो सकते हैं, और आप उनमें से केवल कुछ का चयन कर सकते हैं।

3.3 डीटीओ मैपिंग

हाइबरनेट आपको परिणाम मैप करने के लिए गैर-इकाई कक्षाओं का उपयोग करने की भी अनुमति देता है। वे वर्ग जिनमें कोई एनोटेशन नहीं है और जिन्हें किसी तालिका में मैप नहीं किया गया है।

उदाहरण:

public class PersonSummaryDTO {
    private Number id;
    private String name;

    public Number getId() {
    	return id;
    }

    public void setId(Number id) {
    	this.id = id;
    }

    public String getName() {
    	return name;
    }

    public void setName(String name) {
    	this.name = name;
	}
}

List<PersonSummaryDTO> dtos = session.createNativeQuery(
    "SELECT p.id as \"id\", p.name as \"name\" FROM Person p")
.setResultTransformer(Transformers.aliasToBean(PersonSummaryDTO.class) )
.list();

चूँकि PersonSummaryDTO क्लास में कोई एनोटेशन नहीं है, SQL क्वेरी में कॉलम के नाम PersonSummaryDTO क्लास के फ़ील्ड के नाम से सटीक रूप से मेल खाना चाहिए।

यह बहुत उपयोगी हो सकता है यदि आप बाहरी डेटाबेस से डेटा पढ़ रहे हैं जिससे आपका एप्लिकेशन केवल-पढ़ने के लिए मोड में जुड़ा हुआ है। यही है, आपको उन तालिकाओं तक पहुंच दी गई है जिनमें 50+ कॉलम हैं, वे चयन को गति देने के लिए डेटा को असामान्य रूप में संग्रहीत करते हैं।

या मान लीजिए कि किसी ने वर्ग पदानुक्रम को एक तालिका में संग्रहीत करने का निर्णय लिया, और पाँच वर्षों में यह तालिका इतनी बढ़ गई है कि शैतान उसका पैर तोड़ देगा। आपको इस तालिका (आईडी और उपयोगकर्ता नाम) से कुछ कॉलम का चयन करना होगा और उन्हें क्लाइंट को देना होगा।

मुझे लगता है कि आप समझ गए हैं, लेकिन यदि आप इस विषय में गहराई से जाना चाहते हैं, तो आप लिंक पर अधिक पढ़ सकते हैं:

मूल SQL क्वेरीज़