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 घटक मॅपिंग

NativeQuery चा निकाल पार्स करताना हायबरनेटने कोणता वर्ग वापरला पाहिजे ते तुम्ही स्पष्टपणे देखील निर्दिष्ट करू शकता . हे वेगवेगळ्या प्रकारे केले जाऊ शकते.


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

आणि अर्थातच, तुम्हाला माहीत असलेले चांगले जुने स्वरूप:


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

पहिला दृष्टीकोन मूळ हायबरनेट दृष्टीकोन आहे आणि दुसरा JPA दृष्टीकोन आहे. JPA दृष्टीकोन अधिक सोयीस्कर आणि संक्षिप्त आहे, कारण हायबरनेट बर्याच वर्षांपासून अस्तित्वात असताना या मानकाचा शोध लावला गेला. आणि हायबरनेट विकसित झाले आणि त्याच्या जुन्या आवृत्त्यांशी सुसंगतता राखण्यासाठी जुन्या पद्धतींना समर्थन देणे भाग पडले.

तसे, त्याच्या दृष्टीकोनाबद्दल धन्यवाद, हायबरनेट तुम्हाला क्वेरी परिणाम मॅपिंगमध्ये एक वर्ग नाही तर अनेक वर्ग जोडण्याची परवानगी देतो. उदाहरण:


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() );
}

NativeQuery वापरून हा दृष्टिकोन डेटाबेसमधून डेटाच्या निवडीचा वेग वाढवण्यासाठी वापरला जाऊ शकतो. जर तुम्हाला माहित असेल की तुम्हाला काही स्तंभांची आवश्यकता नाही, तर तुम्ही त्यांना विनंतीमध्ये सोडू शकता.

हायबरनेटला कॅशे किंवा लेझीलोडिंग यंत्रणा वापरायची असली तरीही तुम्ही एकाच वेळी सर्व चाइल्ड एंटिटी लोड करू शकता . याशिवाय, तुमच्या चाइल्ड एंटिटीजमध्ये डेटाबेसमध्ये अनेक कॉलम असू शकतात आणि तुम्ही त्यापैकी काही निवडू शकता.

3.3 DTO मॅपिंग

हायबरनेट तुम्हाला परिणाम मॅप करण्यासाठी नॉन-एंटिटी क्लासेस वापरण्याची परवानगी देते. कोणतेही भाष्य नसलेले आणि कोणत्याही टेबलवर मॅप केलेले नसलेले वर्ग.

उदाहरण:

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 क्वेरी