如何在Hibernate中复制“SHOW TABLES”?

时间:2009-08-20 09:15:42

标签: java hibernate mysql

我正在尝试迭代我的所有表,所以我可以截断每个表(在每个JBehave测试的开头)。

我以为我能够:

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

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

我想这是因为“show tables”查询实际上并不返回字符串列表。有没有其他方法可以使用Hibernate获取所有表的列表?

3 个答案:

答案 0 :(得分:5)

尝试这样的事情:

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

如果您仍然可以访问Hibernate Configuration对象,则可以执行以下操作:

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)