Hibernate中提供了HQL(Hibernate Query Language)和SQL两种查询语言:
HQL:
- 基于对象模型的查询语言,操作对象及属性。
- 表专有名词由Hibernate翻译为数据库表及列。
- 结果以对象形式返回。
- 支持面向对象的高级功能,如继承.多态等。
例如:
Query query = session.createQuery("from Customer c where c.name like ?");
query.setString(0, "%a%");
List<Customer> customers = query.list();
- 标准的关系数据库查询语言,直接操作数据库表.列。
- 需要手动指定表及列名。
- 结果以数组形式返回。
- 不支持面向对象的高级功能,纯粹的集合操作。
例如:
SQLQuery query = session.createSQLQuery("SELECT * FROM Customer WHERE name LIKE ?");
query.setString(0, "%a%");
List<Object[]> customers = query.list();
所以:
- 如果需要使用面向对象的查询或Hibernate的高级功能,使用HQL。
- 如果需要编写低层的SQL或数据库特定语法,使用SQLQuery。
- 也可以在HQL中使用SQL注入的方式编写特定SQL。
例如:
Query query = session.createQuery("from Customer c where c.name like :name");
query.setString("name", "%a%");
query.setComment("order by c.id desc nulls last"); // 添加注释形式的SQL
List<Customer> customers = query.list();