【问题标题】:What is the Hibernate equivalent of "select 1 from DUAL"?“从 DUAL 中选择 1”的 Hibernate 等效项是什么?
【发布时间】:2011-12-12 06:54:38
【问题描述】:

什么是最小的 Hibernate 查询? Hibernate 是否有相当于“从 DUAL 中选择 1”?

我正在编写一个运行状况检查函数并希望执行一个最小查询,但使用 HQL 来保持代码的可移植性(而不是使用本机查询)。

【问题讨论】:

    标签: sql hibernate select hql


    【解决方案1】:

    Hibernate's dialects 被翻译成各种数据库,并且方言中没有“健康检查”或“验证”查询支持。这种事情通常是由连接池完成的,而不是由 Hibernate 完成的。参见,例如,DBCP's validation query property

    【讨论】:

      【解决方案2】:

      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.IGNORECacheMode.REFRESH 来强制查询。否则你可能会检查缓存而不是数据库...

      【讨论】:

        【解决方案3】:

        动态原生 sql 查询将适用。 例如 - session.createSQLQuery("Select 1 from dual").uniqueResult();

        您也可以使用现有表进行查询,例如

        session.createQuery("select 1 from existingTable").setMaxResults(1).uniqueResult();
        

        【讨论】:

          【解决方案4】:

          对于原生查询和双表映射问题,需要使用休眠创建查询

          session.createSQLQuery("SELECT 1 from DUAL") 
          

          而不是与

          session.createQuery("SELECT 1 from DUAL").
          

          【讨论】:

            【解决方案5】:

            嗯,为了便携性,select 1 from dual 不会移植到某些 DB,因为它们没有 dual。 ANSI 标准 information_schema 视图将是一个选项,但同样不能保证您可能使用的所有可能的数据库都会拥有它们 - 但可能会更好。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-17
              • 1970-01-01
              • 2019-03-29
              • 2013-02-19
              相关资源
              最近更新 更多