1.1 HQL'ye Giriş

Daha önce Hibernate ile tanıştınız ve şimdi sizi Hibernate Query Language olarak da bilinen HQL ile tanıştıracağım . Aslında bu, Hazırda Beklet modunda sorgu yazmak için dönüştürülen SQL'dir. Birkaç temel farklılığı vardır.

  1. Tablo adı yerine sınıf adını kullanmak .
  2. Tablo sütun adı yerine sınıf alan adını kullanma .
  3. Seçimin isteğe bağlı kullanımı.

Hibernate'den veritabanındaki tüm kullanıcıları bize geri göndermesini isteyelim. İşte bu isteğin nasıl görüneceği:

from User

Hepsi bu kadar, karşılaştırma için SQL'de benzer bir sorgu sunuyoruz:

select * from user

İşte Usersınıfın adı ve usertablonun adı.

Java kodunun tamamı şöyle görünecektir:


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

Aksi takdirde, HQL, SQL'e çok benzer - ayrıca operatörleri vardır:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 HQL ile çalışma örneği

Önceki örnek, aynı tablo ve alan adlarından dolayı biraz kafa karıştırıcı olabilir. Bunun daha kolay olacağı özel bir örnek bulalım.

Diyelim ki aşağıdaki alanları içeren bir user_data tablomuz var:

  • kimlik INT
  • kullanıcı adı VARCHAR(100)
  • kullanıcı_seviyesi INT
  • user_created DATE

Bu tabloya eşlenecek bir Java sınıfı oluşturacağız:


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="user_name")
   public String name;
 
   @Column(name="user_level")
   public Integer level;
 
   @Column(name="user_created")
   public Date created;
}

Şimdi bazı örnekler yazalım:

HQL SQL
kullanıcıdan user_data'dan * seçin
id=3 olan Kullanıcıdan user_data'dan * seçin, burada id=3
(10,20,30) seviyesindeki Kullanıcıdan user_data'dan * seçin, burada user_level IN (10, 20, 30)
Oluşturulan artışa göre Kullanıcı siparişinden user_data sıralamasından user_created artarak * öğesini seçin
Adın 'test' gibi olduğu Kullanıcıdan user_data'dan * seçin, burada user_name 'test' gibi

Sorgular çok benzerdir ve sınıf adlarına ve alanlarına aşina olduğunuzda HQL sorgularını okumak, SQL sorgularını okumak kadar kolaydır. Yazması biraz daha zor olabilir, ancak yine de, HQL'de çok karmaşık sorgular nadiren yazılır.

1.3 Seçimi kullanma

selectHQL'de, sonucun veri türü, içinde belirtilen türle eşleşmediğinde kullanabilirsiniz from.

Örneğin, user_data tablomuzdaki tüm kullanıcıların isimlerini almak istiyoruz , ardından aşağıdaki sorguyu yazmamız gerekiyor:

select name from User

Ayrıca, isimler arasında yinelenenler varsa şu operatörü kullanabilirsiniz DISTINCT:

select distinct name from User

Takma adlar, SQL'dekiyle aynı şekilde çalışır:

select distinct u.name from User u where u.created > '2020-01-01'

Pekala, tamamen Java kodu biçiminde, bu istek şöyle görünecek:

public List<String> getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query<String> query = session.createQuery(hql , String.class);
            return query.list();
    }
}

Sorgunun bir ad listesi döndürmesi gerektiğini unutmayın. Adlar String türündedir, yani hem işlevin türü hem de Query sınıfının type parametresi String türündedir.