Hibernate中的HQL和SQL有什么区别?代码举例讲解

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();