在哪些情况下我们会选择 SQL、Hibernate Query Language 和 hibernate 的 Criteria API?
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 工具负责处理它们,同时提供优化的解决方案。
使用 JDBC 的SQL查询比 Criteria 查询和 HQL快一点。但是这种性能损失对于所获得的优势是非常值得的。
希望这可以帮助。
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。