2015-12-04 131 views

回答

1

HQL - 这适用于大多数查询并且易于读写。

条件 - 如果你不想写查询,那么你可以使用Criteria API。 例如: -

SELECT * FROM employee WHERE emp_id =1 

标准查询将被

Criteria criteria = session.createCriteria(Employee.class) 
    .add(Restrictions.eq("id", new Integer(1)); 

获取所有员工

List customers = criteria.list(); 

比其他API提供分页,最大行ID,子对象的选择等。

SQL - 其他两个API不适合您的工作,然后使用本机SQL。

1
  • 标准的查询适合用于创建动态查询。 例如,动态添加某些排序或者根据参数的值保留一些部分(例如限制)更容易。

  • 准则查询通过实例化表示查询元素的Java对象而不是字符串来定义。这样做的好处是可以在编译时检测错误。标准查询是类型安全的

  • HQL查询被定义为字符串,类似于SQL。对于静态和复杂查询,使用HQL,因为它更易于理解/阅读。

  • 另外HQL不依赖于数据库的表。我们可以在HQL中使用实体名称,而不是表名。因此它可以用作数据库独立查询语言。

    @Entity(name="MyEntityName") 
    @Table(name="MyEntityTableName") 
    class MyEntity { 
    
    //A table with name MyEntityTableName is created and the entity name is MyEntityName. 
    //Your JPQL/HQL query would be : 
    
    select * from MyEntityName 
    
  • 这两个允许你去耦SQL应用程序。 SQL语法可能因数据库供应商(Oracle,MySQL等)而异。因此,如果您想更改底层数据库,不会有任何影响(或影响最小)

  • 可能有供应商特定的优化SQL功能,您可以利用它们,但它们不符合ANSI标准。像Hibernate这样的ORM工具负责处理它们,同时提供优化的解决方案。

  • SQL查询使用JDBC有点比标准查询和HQL更快。但是这种性能下降对获得的好处非常值得。

希望这会有所帮助。

+1

标准的问题是当您在代码中的某个地方出现问题时,非常大的查询。在Criteria中,你不知道你的查询是什么,并且需要一步一步地找出问题,因此建议在构建非常大的动态查询时使用带有StringBuilder的SQL。 –