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 இன் முடிவைப் பாகுபடுத்தும் போது Hibernate பயன்படுத்த வேண்டிய வகுப்பையும் நீங்கள் வெளிப்படையாகக் குறிப்பிடலாம் . இதை வெவ்வேறு வழிகளில் செய்யலாம்.


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

நிச்சயமாக, உங்களுக்குத் தெரிந்த நல்ல பழைய வடிவம்:


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

முதல் அணுகுமுறை நேட்டிவ் ஹைபர்னேட் அணுகுமுறை மற்றும் இரண்டாவது 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 ஐப் பயன்படுத்தும் இந்த அணுகுமுறை பயன்படுத்தப்படலாம். உங்களுக்கு சில நெடுவரிசைகள் தேவையில்லை என்று தெரிந்தால், கோரிக்கையில் அவற்றை விட்டுவிடலாம்.

Hibernate Cache அல்லது LazyLoading பொறிமுறையைப் பயன்படுத்த விரும்பினாலும், நீங்கள் அனைத்து குழந்தை நிறுவனங்களையும் ஒரே நேரத்தில் ஏற்றலாம் . கூடுதலாக, உங்கள் குழந்தை நிறுவனங்கள் தரவுத்தளத்தில் பல நெடுவரிசைகளைக் கொண்டிருக்கலாம், மேலும் அவற்றில் சிலவற்றை மட்டுமே நீங்கள் தேர்ந்தெடுக்க முடியும்.

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 வினவல்கள்