现在做的系统需要每天生成一张表,将数据插入进去,原先一直是直接使用JDBC+SQL语句实现的,后来在网上找到关于用hibernate实现的方法,试了一下都没有成功,主要是我的hibernate里面的PersistentClass没有setTable方法,很奇怪大家的文章里面都说有,于是改进了一下,总算也是实现啦
创建新表的代码如下:
private static String createNewTable(String tableName) {
try {
Configuration cfg = app.getConfiguration();
if(cfg == null)
return "Hibernate configuration is null !";
String str = AnalogHistoryData.class.getName();
PersistentClass pc = cfg.getClassMapping(str);
if(pc == null)
return "The persistent class of AnalogHistoryData is null !";
Table table = pc.getTable();
if(table.getName().equalsIgnoreCase(tableName))
return null;
table.setName(tableName);
app.setConfiguration(cfg);
app.reload();
} catch (HibernateException e) {
return e.toString();
}
return null;
}
其中AnalogHistoryData是一个持久化类,app是一个封装的关于Hibernate的configuration的类的对象。
查询方法如下:
public static AnalogHistoryData getAnalogHistoryDataById(String deviceId, String dataType, java.util.Date queryDate) {
if (deviceId == null || dataType == null || queryDate == null) {
return null;
}
if (!(dataType.equalsIgnoreCase("KV") || dataType.equalsIgnoreCase("MVAR") || dataType.equalsIgnoreCase("MW"))) {
return null;
}
checkTableIsExisted(dataType, queryDate);
String sql = "from AnalogHistoryData as ah where ah.deviceId = '" + deviceId + "'";
return app.query(sql);
}
checkTableIsExisted方法,就是根据条件生成一个表名,然后创建这个表。这样做主要不好的地方就是查询的地方,比如说今天是7月2号,数据库中存在历史表,但是7月1号,数据库中没有历史表,当查询7月1号的数据的时候,会自动的在数据库中将7月1号的空历史表建出来,当然,这也不影响查询结果。