HQL(Hibernate Query Language)面向對象、支持多態、與數據庫無關,是官方推薦的查詢方式。通過 Session.createQuery() 創建 Query 實例執行。
Query q = session.createQuery(
"from User user order by user.age desc, user.name");
List users = q.list();
// 構造函數表達式 new Package.Class(prop1, prop2)
Query q = session.createQuery(
"select new com.hb3.pack_01.model.UserBak(user.name, user.age) from User user");
List dtos = q.list();
// 平均年齡
Query q = session.createQuery("select avg(user.age) from User user");
// 分組統計
Query q = session.createQuery(
"select user.sex, avg(user.age) from User user group by user.sex");
// Having 過濾
Query q = session.createQuery(
"select user.sex, avg(user.age) from User user group by user.sex having avg(user.age) > 20");
// 位置參數
Query q = session.createQuery("from User where age > ?");
q.setInteger(0, 25);
// 命名參數(推薦)
Query q = session.createQuery("from User where age > :minAge");
q.setInteger("minAge", 25);
Transaction tx = session.beginTransaction();
// 更新
Query q = session.createQuery("update User set age=24 where name='chenyan'");
int updated = q.executeUpdate();
// 刪除
q = session.createQuery("delete User where name='yaobin'");
int deleted = q.executeUpdate();
tx.commit();
<query name="User.QueryUser">
<![CDATA[from User user where user.age > :minAge]]>
</query>
// 調用
Query q = session.getNamedQuery("User.QueryUser");
q.setInteger("minAge", 25);
| 操作 | HQL 示例 |
|---|---|
| 範圍 | age between 20 and 30 |
| 集合包含 | name in ('A', 'B') |
| 模糊匹配 | name like 'cat%' |
| 統計函數 | count(*), sum(age), max(age) |