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.