2.1 Sorgu sınıflarına giriş

Bu arada bir diğer önemli nokta da Query yardımcı sınıfı. Bu örnekte görebilirsiniz:

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

Aslında, Query bir arayüzdür ve farklı durumlar için birkaç uygulaması vardır. Ancak basit olması için buna bir sınıf demeye devam edeceğim. Bu, diyelim ki, geniş anlamda bir sınıftır - OOP açısından.

Not. Eskiden iki sınıf vardı:

  • Sorguyu açıklamak için sorgulayın .
  • TypedQuery, bilinen bir türe sahip bir sorguyu açıklamak için.

İlki, Hazırda Bekletme zaten varken ortaya çıktı ve henüz jenerik yoktu. Ardından, JDK 5'in piyasaya sürülmesinden sonra, Hibernate - TypedQuery'ye zaten sorgu sonucunun yazılmasını destekleyen başka bir sınıf eklendi.

Ancak hatırladığım kadarıyla Hibernate'in 5. versiyonundan başlayarak sadece bir tip sınıf kalmıştı ve artık adı Query.

Sorgu oluşturmanın standart yolu şudur:


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

Sorgu nesneleri oluşturmayı öğrendiniz, ancak bu sorguları nasıl yürütüyorsunuz?

Burada daha da basit - biz sadece Query nesnesinde list() yöntemini çağırıyoruz:


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

list() yöntemi , aynı şeyi yapan ancak getResultList() olarak adlandırılan bir JPA eşanlamlısına sahiptir . Bazen diğer programcılar tarafından yazılan kodlarda görebilirsiniz.

Bu arada, sorgu sonucun tek bir sonuçta olacağını ima ediyorsa, sorguyu çağırmak için uniqueResult() yöntemini kullanmak daha kolaydır .


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

uniqueResult() yönteminin bir JPA eşanlamlısı vardır, singleResult() yöntemi . Hibernate'in JPA standardı ile uyumluluğu için tanıtıldı. Tam olarak aynı şeyi yapıyor.

2.2 Sorgu sınıfı yöntemleri

Aslında, Query sınıfının birçok farklı yöntemi vardır. Aşağıda üç tanesinden daha bahsedeceğim.

İlki stream() yöntemidir . Ve JPA eşanlamlısı getResultStream() .

Bu yöntemlerin her ikisi de liste yerine bir veri akışı döndürür. Bu yaklaşım, bir sorgu sonucunda elde edilen tüm nesnelere aynı anda ihtiyacınız olmadığında çok verimli olabilir. Ya da sadece birincisinin kullanılması ihtimali vardır.

Örnek:


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

İkinci yöntem ise, executUpdate() yöntemidir . Veritabanındaki bir şeyi değiştirecek bir sorgu yazabilirsiniz. Bu durumda, Hibernate'in veri tabanına erişirken salt okunur bir işlem kullanmaması gerekir.

Örnek talep: Tüm kullanıcıların seviyesini 1 artırmaya karar verdik.


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

executUpdate() yöntemi , gerçekten değiştirilmiş olan satır sayısını döndürür.

Ve son olarak üçüncü yöntem scroll() . Size biraz daha anlatacağız.

2.3 Kaydırma sınıfı yöntemleri

Bu yöntem , stream() yöntemine biraz benzer . Yalnızca, sonuçları hiç çıkarmadan sonuçlar listesinde gezinmenize izin verir. Yani, bir sorgu yürütebilir, ardından sonucun milyonuncu satırına kaydırabilir ve oradan veri okumaya başlayabilirsiniz.

Böyle gelişmiş bir yineleyici.


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

ScrollableResults nesnesi aşağıdaki yöntemlere sahiptir:

Yöntem Tanım
R olsun() Geçerli öğeyi döndürür
Sonraki() İşaretçiyi bir sonraki öğeye taşır
öncesi() İşaretçiyi önceki öğeye taşır
kaydırma(int boyutu) Boyut satırlarına göre ileri kaydır
konum(int konum) Öğe konum numarasını geçerli öğe yapar
son() Geçerli öğe artık son öğedir
Birinci() Geçerli öğe şimdi ilk
getRowNumber() Geçerli satır numarasını döndürür
setRowNumber() Geçerli satır numarasını ayarlar

Diyelim ki bir sorgu yaptınız ve son öğeyi almak istiyorsunuz. Bunu nasıl yapacağınız aşağıda açıklanmıştır:


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