【问题标题】:How can I replicate "SHOW TABLES" in Hibernate?如何在 Hibernate 中复制“SHOW TABLES”?
【发布时间】:2009-08-20 09:15:41
【问题描述】:

我正在尝试遍历我的所有表,以便截断每个表(在每个 JBehave 测试开始时)。

我认为我可以:

List<String> allTables = session.createSQLQuery("SHOW TABLES").list();

但是 hibernate 抛出一个 SQLGrammarException,抱怨“找不到列 'TABLE_NAME'。”

我猜这是因为“显示表”查询实际上并没有返回字符串列表。还有另一种方法可以使用 Hibernate 获取我的所有表的列表吗?

【问题讨论】:

    标签: java hibernate mysql


    【解决方案1】:

    试试这样的:

    SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE();
    

    对于列(与 Hibernate 的情况相同)尝试:

    SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=YOUR_TABLE_NAME
    

    【讨论】:

      【解决方案2】:

      如果你想截断你的所有表,你可以在 hibernate.cfg.xml 中通过值 Create 设置 hibernate.hbm2ddl.auto

      <property name="hbm2ddl.auto">create</property>
      

      但如果您只想获取所有表名并截断其中一些,则此方法不起作用。

      【讨论】:

        【解决方案3】:

        如果您仍然可以访问 Hibernate 配置对象,您可以这样做:

        for (Iterator iter=configuration.getClassMappings(); iter.hasNext();) {
          PersistentClass persistentClass = (PersistentClass)iter.next();
          String table = persistentClass.getTable().getName();
          // Code to truncate table (or just use a query with session.executeUpdate)
        }
        

        假设您每个实体有一个表,并且您只关心映射的表。否则,您可能需要对底层连接和 DatabaseMetaData 做一些事情,例如:

        session.connection().getMetaData().getTables(catalog, schemaPattern, tableNamePattern, types)
        

        【讨论】:

          猜你喜欢
          • 2012-07-23
          • 2011-10-06
          • 2019-03-22
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 2010-09-12
          • 2021-08-07
          • 1970-01-01
          相关资源
          最近更新 更多