निकष API चा परिचय

हायबरनेटमध्ये डेटाबेस क्वेरी लिहिण्याचे दोन मार्ग आहेत:

  • हायबरनेट क्वेरी भाषा
  • निकष API

तुम्ही खूप पूर्वीच पहिल्याला भेटला आहात, निकष API शी परिचित होण्याची वेळ आली आहे. हे एक अतिशय शक्तिशाली साधन आहे, काही वेळा ते HQL पेक्षाही अधिक लोकप्रिय होते. आता ते इतके लोकप्रिय नाही, परंतु काही कार्यांसाठी हे निश्चितपणे HQL पेक्षा चांगले उपाय असेल.

कोणत्याही परिस्थितीत, निकष 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 क्वेरीचे हे अवघड बांधकाम आहे.

निकष API सह कार्य करण्याची उदाहरणे

अधिक चांगल्या प्रकारे समजून घेण्यासाठी, मी फक्त काही उदाहरणे देईन.

विनंती १ . 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")));

क्वेरी तयार करण्याचा हा एक अवघड मार्ग आहे:

  • प्रथम आपण ऑब्जेक्ट मिळवानिकष बिल्डर.
  • नंतर ऑब्जेक्ट तयार करण्यासाठी त्याचा वापर करानिकष क्वेरी.
  • मग तुम्ही त्यात भाग जोडण्यास सुरुवात करानिकष क्वेरीआणिनिकष बिल्डर.

यासाठी तुम्ही पॅरामीटर्स कसे सेट करू शकता:

  • निवडा
  • पासून
  • कुठे

तसेच वापरत आहेनिकष बिल्डरआपण WHERE साठी भिन्न परिस्थिती तयार करू शकता.

निकष API सह प्रगत कार्य

निकष 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)
अ > ब gt(a, b) builder.gt(a, b)
a OR b किंवा(a,b) builder.or(a, b)
a आणि b आणि(a,b) बिल्डर.आणि(अ,ब)
a LIKE b जसे(a, b) बिल्डर.like(a, b)
a (c, d) मधील दरम्यान (a, c, d) बिल्डर.दरम्यान(a, c, d)
एक IS NULL आहे 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() द्वारे ऑब्जेक्टवरून घेतली जातातमूळ.