【发布时间】:2011-12-12 06:54:38
【问题描述】:
什么是最小的 Hibernate 查询? Hibernate 是否有相当于“从 DUAL 中选择 1”?
我正在编写一个运行状况检查函数并希望执行一个最小查询,但使用 HQL 来保持代码的可移植性(而不是使用本机查询)。
【问题讨论】:
什么是最小的 Hibernate 查询? Hibernate 是否有相当于“从 DUAL 中选择 1”?
我正在编写一个运行状况检查函数并希望执行一个最小查询,但使用 HQL 来保持代码的可移植性(而不是使用本机查询)。
【问题讨论】:
Hibernate's dialects 被翻译成各种数据库,并且方言中没有“健康检查”或“验证”查询支持。这种事情通常是由连接池完成的,而不是由 Hibernate 完成的。参见,例如,DBCP's validation query property。
【讨论】:
SQLselect 1 from DUAL; 不是一个很好的健康检查,你看到的唯一的东西是一个服务器响应,它不知道数据本身是否健康。但是,如果您想提出这样的问题,只需创建您自己的模拟 DUAL 的数据实体,您就可以控制该对象,并且您将保持对任何 RDBMS 的通用性。
类似
@Entity
@Table(name="myDual")
public class MyDual implements Serializable {
@Id
@Column(name = "id")
Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
不要忘记使用CacheMode.IGNORE 或CacheMode.REFRESH 来强制查询。否则你可能会检查缓存而不是数据库...
【讨论】:
动态原生 sql 查询将适用。
例如 - session.createSQLQuery("Select 1 from dual").uniqueResult();
您也可以使用现有表进行查询,例如
session.createQuery("select 1 from existingTable").setMaxResults(1).uniqueResult();
【讨论】:
对于原生查询和双表映射问题,需要使用休眠创建查询
session.createSQLQuery("SELECT 1 from DUAL")
而不是与
session.createQuery("SELECT 1 from DUAL").
【讨论】:
嗯,为了便携性,select 1 from dual 不会移植到某些 DB,因为它们没有 dual。 ANSI 标准 information_schema 视图将是一个选项,但同样不能保证您可能使用的所有可能的数据库都会拥有它们 - 但可能会更好。
【讨论】: