Hibernate HQL 核心语法详解与实战技巧
HQL(Hibernate Query Language)是面向对象的查询语言,它允许我们使用 Java 对象和属性来操作数据库。相比原生 SQL,HQL 更贴近业务逻辑,且具备更好的跨数据库兼容性。下面结合实战场景,梳理 HQL 的核心用法。
实体查询
最基本的查询方式是从实体类开始。例如查询 TUser 表:
String hql = "from TUser";
List<TUser> list = session.createQuery(hql, TUser.class).list();
这条语句会返回 TUser 及其子类的记录。需要注意的是,如果 TUser 包含外键关联且未配置合适的加载策略,直接全量查询可能会触发懒加载异常或性能问题。建议在实际开发中明确指定需要加载的属性。
特殊场景:
// 查询所有库表记录(慎用)
String hql = "from java.lang.Object";
虽然语法上可行,但这会检索数据库中所有表的数据,极易导致内存溢出,生产环境请避免使用。
条件过滤:
// 标准写法
String hql = "from TUser as user where user.name = :name";
Query query = session.createQuery(hql);
query.setParameter("name", "yyy");
// 别名可省略,但推荐保留以增强可读性
String hql2 = "from TUser user where user.name = 'yyy'";
支持的操作符包括 =, <>, >, <, >=, <=, between, not between, in, not in, is, like 等。
属性查询与投影
当不需要完整实体时,可以直接查询特定属性,甚至封装为新的对象实例。
// 查询多个属性
List<Object[]> list = session.createQuery(
).list();
List<TUser> users = session.createQuery(
).list();
Iterator<TUser> it = users.iterator();
(it.hasNext()) {
it.next();
System.out.println(user.getName());
}

