【问题标题】:SQL, HQL and Criteria API of hibernate [closed]休眠的 SQL、HQL 和 Criteria API [关闭]
【发布时间】:2016-03-08 23:02:05
【问题描述】:

在哪些情况下我们选择了SQL、Hibernate Query Language和hibernate的Criteria API?

【问题讨论】:

    标签: hql hibernate-criteria hibernate-native-query


    【解决方案1】:

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

    Criteria - 如果您不想编写查询,则可以使用 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。

    【讨论】:

      【解决方案2】:
      • 条件查询适用于创建动态查询。 例如,根据参数的值动态添加一些排序或保留一些部分(例如限制)要容易得多。

      • 条件查询,是由 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 稍微。但这种性能损失对于所获得的优势来说是非常值得的。

      希望这会有所帮助。

      【讨论】:

      • 当您在代码中的某个地方遇到问题时,标准的问题是针对非常大的查询。在 Criteria 中,您不知道您的查询是什么,需要逐步查找问题,所以我建议在构建非常大的动态查询时使用 SQL 和 stringBuilder。
      猜你喜欢
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多