Criteria API'ye Giriş
Hazırda bekletme modunda veritabanı sorguları yazmanın iki yolu vardır:
- Hazırda Bekleme Sorgulama Dili
- Kriter API'si
İlki ile uzun zaman önce tanıştınız, artık Criteria API ile tanışma zamanı. Bu çok güçlü bir araçtır, bir noktada HQL'den bile daha popülerdi. Artık o kadar popüler değil ama bazı görevler için kesinlikle HQL'den daha iyi bir çözüm olacak.
Her durumda, Criteria API'sine aşina olmadan Hazırda Bekletmeyi öğrenemezsiniz. Küçük bir örnek yazalım ve sonra onu analiz edeceğiz. Örneğin tüm çalışanları (Çalışan) veri tabanından talep edeceğiz. İşte elde edeceklerimiz:
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();
Karmaşık görünüyor. Karşılaştırma için aynı HQL sorgusunu yazalım:
String hqlQuery = "from Employee";
Query<Employee> query = session.createQuery(hqlQuery);
List<Employee> results = query.getResultList();
Her iki örneğin son iki satırının neredeyse aynı olduğuna dikkat edin: bir Query nesnesi oluşturuyoruz ve onu bir List elde etmek için kullanıyoruz. Bu, satırların geri kalanının aynı şeyi yaptığını ima eder.
İlk örneğin 3. ve 4. satırlarına bakın:
Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);
Bunları tek satırda yazalım:
critQuery.select(critQuery.from(Employee.class));
Size bir şey hatırlatmıyor mu? Ve biraz farklı renklendirirseniz:
critQuery.select(critQuery.from(Employee.class));
Evet, bu, SELECT FROM sorgusunun çok zor bir yapısıdır.
Criteria API ile çalışma örnekleri
Daha iyi anlaşılması için sadece birkaç örnek vereceğim.
1. istek 10 binin üzerinde maaşı olan tüm çalışanları alın:
critQuery.select(critQuery.from(Employee.class)).where(builder.gt(root.get("salary"), 10000));
2. istek 50 binden az maaşlı tüm çalışanları alın:
critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 50000));
3. istek İş unvanı "test" kelimesini içeren tüm çalışanları alın:
critQuery.select(critQuery.from(Employee.class)).where(builder.like(root.get("occupation"), "%test%"));
4. istek Tüm çalışanları 10 ila 50 bin maaşla alın:
critQuery.select(critQuery.from(Employee.class)).where(builder.between(root.get("salary"), 10000, 50000));
5 . Adı boş olan tüm çalışanları alın:
critQuery.select(critQuery.from(Employee.class)).where(builder.isNull(root.get("name")));
6. istek Adı boş olmayan tüm çalışanları alın:
critQuery.select(critQuery.from(Employee.class)).where(builder.isNotNull(root.get("name")));
Bir sorgu oluşturmanın çok zor bir yolu:
- Önce nesneyi alırsınÖlçüt Oluşturucu.
- Sonra bir nesne oluşturmak için kullanınÖlçüt Sorgusu.
- Sonra ona parçalar eklemeye başlarsınız.Ölçüt SorgusuVeÖlçüt Oluşturucu.
Aşağıdakiler için parametreleri şu şekilde ayarlayabilirsiniz:
- SEÇME
- İTİBAREN
- NEREDE
Ayrıca kullanarakÖlçüt OluşturucuWHERE için farklı koşullar oluşturabilirsiniz.
Criteria API ile gelişmiş çalışma
Criteria API'yi kullanarak herhangi bir karmaşıklıkta bir sorgu oluşturabilirsiniz. Ve bu harika bir haber. Örneğin, karmaşık bir WHERE yan tümcesi istiyorsunuz. Bunu nasıl yapacağınız aşağıda açıklanmıştır:
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));
VEYA yerine VE yazmak istiyorsanız, yalnızca son satırı değiştirmeniz gerekir:
critQuery.select(critQuery.from(Employee.class)).where(builder.and(greaterThan, testers));
Her şey aslında çok basit. Size birkaç karşılaştırma içeren bir tablo vereyim:
SQL | Yöntem | Tam kayıt |
---|---|---|
bir <b | lt(a, b) | builder.lt(a, b) |
bir > b | gt(a, b) | oluşturucu.gt(a, b) |
A veya b | veya(a,b) | oluşturucu.veya(a, b) |
a ve B | ve(a,b) | oluşturucu.ve(a,b) |
bir BEĞEN b | (a,b) gibi | oluşturucu.like(a, b) |
a ARASINDA (c, d) | arasında(a, c, d) | oluşturucu.arasında(a, c, d) |
bir BOŞ | Null(a) | builder.isNull(a) |
a BOŞ DEĞİLDİR | isNotNull(a) | builder.isNotNull(a) |
Her şey basit, değil mi?
Ve sorguya sıralamayı nasıl ekleyeceğiz? Çok basit:
critQuery.select( critQuery.from(Employee.class) );
critQuery.where( builder.and(greaterThan, testers) );
critQuery.orderBy( builder.asc(root.get("salary"), builder.desc(root.get("joinDate") )
Siz sadece nesneyi çağırınÖlçüt SorgusuorderBy() yöntemini seçin ve gerekli parametreleri ona iletin.
Aynı sorgunun HQL'de nasıl görüneceği aşağıda açıklanmıştır. Karşılaştırmak:
select * from Employee
where (…) and (…)
order by 'salary' asc, 'joinDate' desc
Sadece 3 şeyi hatırlamanız gerekiyor:
- SELECT, FROM, WHERE gibi anahtar işleçler bir nesne üzerinde çağrılırÖlçüt Sorgusu.
- AND, OR, DESC gibi yardımcı operatörler nesne üzerinde çağrılır.Ölçüt Oluşturucu.
- Alan adları nesneden get() aracılığıyla alınır.kök.
GO TO FULL VERSION