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.
- Tablo adı yerine sınıf adını kullanmak .
- Tablo sütun adı yerine sınıf alan adını kullanma .
- 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 User
sınıfın adı ve user
tablonun 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
select
HQL'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.
GO TO FULL VERSION