我正在尝试迭代我的所有表,所以我可以截断每个表(在每个JBehave测试的开头)。
我以为我能够:
List<String> allTables = session.createSQLQuery("SHOW TABLES").list();
但是hibernate会抛出一个SQLGrammarException,抱怨“找不到列'TABLE_NAME'。”
我想这是因为“show tables”查询实际上并不返回字符串列表。有没有其他方法可以使用Hibernate获取所有表的列表?
答案 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)