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

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

我以为我能够:

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

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

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

尝试这样的事情:

 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 

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

 create 

但是如果你想获取所有的表名并截断它们中的一些,这种方法就不起作用了。

如果您仍然可以访问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)