2.1 வினவல் வகுப்புகளுக்கான அறிமுகம்

மூலம், மற்றொரு முக்கியமான விஷயம் வினவல் உதவி வகுப்பு. இந்த எடுத்துக்காட்டில் நீங்கள் அதைக் காணலாம்:

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

உண்மையில், வினவல் ஒரு இடைமுகம் மற்றும் இது வெவ்வேறு நிகழ்வுகளுக்கு பல செயலாக்கங்களைக் கொண்டுள்ளது. ஆனால் எளிமைக்காக, நான் அதை ஒரு வகுப்பு என்று தொடர்ந்து அழைப்பேன். இது ஒரு பரந்த பொருளில் - OOP அடிப்படையில் ஒரு வர்க்கம் என்று சொல்லலாம்.

குறிப்பு. இரண்டு வகுப்புகள் இருந்தன:

  • வினவலை விவரிக்க வினவல் .
  • TypedQuery என்பது அறியப்பட்ட வகையுடன் வினவலை விவரிக்க.

ஹைபர்னேட் ஏற்கனவே இருந்தபோது முதலில் தோன்றியது, இன்னும் ஜெனரிக்ஸ் எதுவும் இல்லை. பின்னர், JDK 5 வெளியீட்டிற்குப் பிறகு, மற்றொரு வகுப்பு Hibernate - TypedQuery இல் சேர்க்கப்பட்டது, இது ஏற்கனவே வினவல் முடிவைத் தட்டச்சு செய்வதை ஆதரிக்கிறது.

ஆனால், எனக்கு நினைவிருக்கும் வரை, ஹைபர்னேட்டின் 5வது பதிப்பில் தொடங்கி, ஒரே ஒரு தட்டச்சு வகுப்பு மட்டுமே எஞ்சியிருந்தது, அது இப்போது வினவல் என்று அழைக்கப்படுகிறது.

வினவலை உருவாக்குவதற்கான நிலையான வழி:


Query<Employee> query = session.createQuery("from Employee", Employee.class);

வினவல் பொருட்களை எவ்வாறு உருவாக்குவது என்பதை நீங்கள் கற்றுக்கொண்டீர்கள், ஆனால் இந்த வினவல்களை எவ்வாறு இயக்குவது?

இங்கே இன்னும் எளிமையானது - வினவல் பொருளில் உள்ள பட்டியல்() முறையை நாங்கள் அழைக்கிறோம் :


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

பட்டியல்() முறைக்கு ஒரு JPA இணைச்சொல் உள்ளது, இது அதையே செய்யும் ஆனால் getResultList() என்று அழைக்கப்படுகிறது . நீங்கள் சில சமயங்களில் மற்ற புரோகிராமர்களால் எழுதப்பட்ட குறியீட்டில் பார்க்கலாம்.

மூலம், வினவல் முடிவு ஒரே முடிவில் இருக்கும் என்று குறிப்பிடுகிறது என்றால், வினவலை அழைப்பதற்கு, uniqueResult() முறையைப் பயன்படுத்துவது எளிதாக இருக்கும் .


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

யுனிக் ரிசல்ட்() முறை JPA க்கு இணையான, singleResult() முறை . இது JPA தரநிலையுடன் Hibernate இன் இணக்கத்தன்மைக்காக அறிமுகப்படுத்தப்பட்டது. அவரும் அதையே செய்கிறார்.

2.2 வினவல் வகுப்பு முறைகள்

உண்மையில், வினவல் வகுப்பில் பல்வேறு முறைகள் உள்ளன. அவற்றில் மேலும் மூன்று பற்றி நான் கீழே பேசுவேன்.

முதலாவது ஸ்ட்ரீம்() முறை . மற்றும் அதன் JPA இணையான getResultStream() .

இந்த இரண்டு முறைகளும் பட்டியலுக்குப் பதிலாக தரவின் ஸ்ட்ரீமை வழங்கும். வினவலின் விளைவாகப் பெறப்பட்ட அனைத்துப் பொருட்களும் ஒரே நேரத்தில் உங்களுக்குத் தேவைப்படாதபோது இந்த அணுகுமுறை மிகவும் பயனுள்ளதாக இருக்கும். அல்லது அவற்றில் முதன்மையானது மட்டுமே பயன்படுத்தப்படும் வாய்ப்பு உள்ளது.

உதாரணமாக:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

இரண்டாவது முறை executeUpdate() முறை . தரவுத்தளத்தில் ஏதாவது ஒன்றை மாற்றும் வினவலை நீங்கள் எழுதலாம். இந்த நிலையில், தரவுத்தளத்தை அணுகும் போது, ​​Hibernate படிக்க மட்டுமேயான பரிவர்த்தனையைப் பயன்படுத்தாமல் இருப்பது அவசியம்.

கோரிக்கை உதாரணம்: அனைத்து பயனர்களின் அளவையும் 1 ஆல் உயர்த்த முடிவு செய்தோம்.


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

executeUpdate() முறை உண்மையில் மாற்றியமைக்கப்பட்ட வரிசைகளின் எண்ணிக்கையை வழங்கும்.

இறுதியாக மூன்றாவது முறை உருள்() . அதைப் பற்றி இன்னும் கொஞ்சம் கூறுவோம்.

2.3 ஸ்க்ரோல் வகுப்பு முறைகள்

இந்த முறை ஸ்ட்ரீம்() முறைக்கு ஓரளவு ஒத்திருக்கிறது . முடிவுகளை வெளியே இழுக்காமல் முடிவுகளின் பட்டியலை நகர்த்த இது மட்டுமே உங்களை அனுமதிக்கிறது. அதாவது, நீங்கள் ஒரு வினவலை இயக்கலாம், பின்னர் அதை முடிவின் மில்லியன் வரிக்கு உருட்டி அங்கிருந்து தரவைப் படிக்கத் தொடங்கலாம்.

அத்தகைய ஒரு மேம்பட்ட மறு செய்கை.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

ScrollableResults ஆப்ஜெக்ட் பின்வரும் முறைகளைக் கொண்டுள்ளது:

முறை விளக்கம்
R get() தற்போதைய உறுப்பை வழங்குகிறது
அடுத்தது() சுட்டியை அடுத்த உறுப்புக்கு நகர்த்துகிறது
முந்தைய () சுட்டியை முந்தைய உறுப்புக்கு நகர்த்துகிறது
உருள் (எண் அளவு) அளவு கோடுகளால் முன்னோக்கி உருட்டவும்
நிலை (int pos) உறுப்பு போஸ் எண்ணை தற்போதைய உறுப்பாக மாற்றுகிறது
கடந்த() தற்போதைய உறுப்பு இப்போது கடைசியாக உள்ளது
முதல்() தற்போதைய உறுப்பு இப்போது முதலில் உள்ளது
getRowNumber() தற்போதைய வரி எண்ணை வழங்குகிறது
setRowNumber() தற்போதைய வரி எண்ணை அமைக்கிறது

நீங்கள் வினவலை இயக்கியுள்ளீர்கள், கடைசி உறுப்பைப் பெற விரும்புகிறீர்கள் என்று வைத்துக்கொள்வோம். அதை எப்படி செய்வது என்பது இங்கே:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();