【发布时间】:2016-03-08 23:02:05
【问题描述】:
在哪些情况下我们选择了SQL、Hibernate Query Language和hibernate的Criteria API?
【问题讨论】:
标签: hql hibernate-criteria hibernate-native-query
在哪些情况下我们选择了SQL、Hibernate Query Language和hibernate的Criteria API?
【问题讨论】:
标签: hql hibernate-criteria hibernate-native-query
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。
【讨论】:
条件查询适用于创建动态查询。 例如,根据参数的值动态添加一些排序或保留一些部分(例如限制)要容易得多。
条件查询,是由 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 稍微快。但这种性能损失对于所获得的优势来说是非常值得的。
希望这会有所帮助。
【讨论】: