Criteria API அறிமுகம்

ஹைபர்னேட்டில் தரவுத்தள வினவல்களை எழுத இரண்டு வழிகள் உள்ளன:

  • ஹைபர்னேட் வினவல் மொழி
  • அளவுகோல் API

நீங்கள் ஏற்கனவே நீண்ட காலத்திற்கு முன்பு முதல்வரைச் சந்தித்திருக்கிறீர்கள், இது Criteria API உடன் பழகுவதற்கான நேரம். இது மிகவும் சக்திவாய்ந்த கருவியாகும், சில சமயங்களில் இது HQL ஐ விட மிகவும் பிரபலமானது. இப்போது இது மிகவும் பிரபலமாக இல்லை, ஆனால் சில பணிகளுக்கு இது நிச்சயமாக HQL ஐ விட சிறந்த தீர்வாக இருக்கும்.

எவ்வாறாயினும், Criteria API ஐப் பற்றி நன்கு தெரிந்து கொள்ளாமல், நீங்கள் ஹைபர்னேட்டைக் கற்றுக்கொள்ள முடியாது. ஒரு சிறிய உதாரணத்தை எழுதுவோம், பின்னர் அதை பகுப்பாய்வு செய்வோம். எடுத்துக்காட்டாக, தரவுத்தளத்திலிருந்து அனைத்து ஊழியர்களையும் (பணியாளர்) கோருவோம். நாம் பெறுவது இங்கே:

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> critQuery = builder.createQuery(Employee.class);

Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);

Query<Employee> query = session.createQuery(critQuery);
List<Employee> results = query.getResultList();

சிக்கலானதாகத் தெரிகிறது. ஒப்பிடுவதற்கு அதே HQL வினவலை எழுதுவோம்:

String hqlQuery = "from Employee";

Query<Employee> query = session.createQuery(hqlQuery);
List<Employee> results = query.getResultList();

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

முதல் உதாரணத்தின் 3 மற்றும் 4 வரிகளைப் பாருங்கள்:

Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);

அவற்றை ஒரே வரியில் எழுதுவோம்:

critQuery.select(critQuery.from(Employee.class));

இது உங்களுக்கு எதையும் நினைவூட்டவில்லையா? நீங்கள் அதை சற்று வித்தியாசமாக வண்ணமயமாக்கினால்:

critQuery.select(critQuery.from(Employee.class));

ஆம், இது SELECT FROM வினவலின் மிகவும் தந்திரமான கட்டுமானமாகும்.

Criteria API உடன் பணிபுரிவதற்கான எடுத்துக்காட்டுகள்

சிறந்த புரிதலுக்காக, நான் சில எடுத்துக்காட்டுகளைத் தருகிறேன்.

கோரிக்கை 1 . 10 ஆயிரத்துக்கு மேல் சம்பளம் உள்ள அனைத்து ஊழியர்களையும் பெறுங்கள்:

critQuery.select(critQuery.from(Employee.class)).where(builder.gt(root.get("salary"), 10000));

கோரிக்கை 2 . 50 ஆயிரத்துக்கும் குறைவான சம்பளம் உள்ள அனைத்து ஊழியர்களையும் பெறுங்கள்:

critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 50000));

கோரிக்கை 3 . பணித் தலைப்பில் "சோதனை" என்ற வார்த்தை உள்ள அனைத்து ஊழியர்களையும் பெறவும்:

critQuery.select(critQuery.from(Employee.class)).where(builder.like(root.get("occupation"), "%test%"));

கோரிக்கை 4 . 10 முதல் 50 ஆயிரம் வரை சம்பளம் உள்ள அனைத்து ஊழியர்களையும் பெறுங்கள்:

critQuery.select(critQuery.from(Employee.class)).where(builder.between(root.get("salary"), 10000, 50000));

கோரிக்கை 5 . பெயர் பூஜ்யமாக உள்ள அனைத்து ஊழியர்களையும் பெறவும்:

critQuery.select(critQuery.from(Employee.class)).where(builder.isNull(root.get("name")));

கோரிக்கை 6 . பெயர் பூஜ்யமாக இல்லாத அனைத்து ஊழியர்களையும் பெறவும்:

critQuery.select(critQuery.from(Employee.class)).where(builder.isNotNull(root.get("name")));

வினவலை உருவாக்க இது ஒரு தந்திரமான வழி:

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

இப்படி நீங்கள் அளவுருக்களை அமைக்கலாம்:

  • தேர்ந்தெடுக்கவும்
  • இருந்து
  • எங்கே

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

Criteria API உடன் மேம்பட்ட வேலை

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

Predicate greaterThan = builder.gt(root.get("salary"), 1000);
Predicate testers = builder.like(root.get("occupation"), "test%");

critQuery.select(critQuery.from(Employee.class)).where(builder.or(greaterThan, testers));

OR க்கு பதிலாக AND என்று எழுத விரும்பினால், கடைசி வரியை மட்டும் மாற்ற வேண்டும்:

critQuery.select(critQuery.from(Employee.class)).where(builder.and(greaterThan, testers));

எல்லாம் உண்மையில் மிகவும் எளிமையானது. சில ஒப்பீடுகளுடன் ஒரு அட்டவணையைத் தருகிறேன்:

SQL முறை முழு பதிவு
a<b lt(a, b) builder.lt(a, b)
a > b gt(a, b) builder.gt(a, b)
a OR b அல்லது(a,b) builder.or(a, b)
a மற்றும் b மற்றும்(a,b) builder.and(a,b)
ஒரு லைக் ஆ போன்ற(a, b) கட்டடம்.like(a, b)
ஒரு இடையே (c, d) இடையே (a, c, d) பில்டர்.இடையில்(a, c, d)
a பூஜ்யமானது isNull(a) builder.isNull(a)
a பூஜ்யமாக இல்லை isNotNull(a) builder.isNotNull(a)

எல்லாம் எளிது, இல்லையா?

மேலும் வினவலில் வரிசையாக்கத்தை எவ்வாறு சேர்ப்பது? மிக எளிய:

critQuery.select( critQuery.from(Employee.class) );
critQuery.where( builder.and(greaterThan, testers) );
critQuery.orderBy( builder.asc(root.get("salary"), builder.desc(root.get("joinDate") )

நீங்கள் பொருளை மட்டும் அழைக்கிறீர்கள்அளவுகோல் வினவல்orderBy() முறை மற்றும் தேவையான அளவுருக்களை அதற்கு அனுப்பவும்.

HQL இல் அதே வினவல் எப்படி இருக்கும் என்பது இங்கே. ஒப்பிடு:

select * from Employee
where (…) and (…)
order by 'salary' asc, 'joinDate' desc

நீங்கள் 3 விஷயங்களை நினைவில் கொள்ள வேண்டும்:

  • SELECT, FROM, WHERE போன்ற முக்கிய ஆபரேட்டர்கள் ஒரு பொருளில் அழைக்கப்படுகின்றனஅளவுகோல் வினவல்.
  • AND, OR, DESC போன்ற துணை ஆபரேட்டர்கள் பொருளில் அழைக்கப்படுகின்றனர்அளவுகோல் கட்டுபவர்.
  • புலத்தின் பெயர்கள் பொருளிலிருந்து get() வழியாக எடுக்கப்படுகின்றன.வேர்.