我正在使用Spring,Hibernate和Postgres。 在我的一个模型课中,我有:
��ur[Ljava.lang.Integer;������xpsr...
它已被使用,我在数据库中有上述格式的数据。
“data”字段是bytea(在phppgadmin中可见)类型,db中保存的示例值之一是:
String[] data;
问题是现在我需要将模型更改为
File::open
但是当我这样做时,Hibernate无法读取这些数据,因为它的类型为Integer。
我的问题 - 是否有可能将这些Integer数组对象转换为String数组对象?使用一些db工具,sql查询还是Hibernate?
答案 0 :(得分:0)
您需要编写一次转换算法才能运行一次。类似的东西:
Connection c = ((SessionImplementor)entitymanager).connection();
boolean oldstate = c.getAutoCommit();
c.setAutoCommit(false);
Statement s = c.createStatement();
PreparedStatement ps = c.prepareStatement("UPDATE my_table SET data = ? WHERE id = ?");
ResultSet rs = s.executeQuery("SELECT id, data FROM my_table");
ByteArrayInputStream bais;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectInputStream ois;
ObjectOutputStream oos = new ObjectOutputStream(baos);
while (rs.next()) {
long id = rs.getLong(1);
byte[] bdata = rs.getBytes(2);
bais = new ByteArrayInputStream(bdata);
ois = new ObjectInputStream(bais);
Integer[] olddata = (Integer[]) ois.readObject();
String[] newdata = new String[olddata.length];
for (int i = 0; i < olddata.length; i++) {
Integer din = olddata[i];
String dout = null;
if (din != null) {
dout = din.toString();
}
newdata[i] = dout;
}
oos.writeObject(newdata);
oos.flush();
ps.setLong(1, id);
ps.setBytes(2, baos.toByteArray());
baos.reset();
}
c.commit();
c.setAutoCommit(oldstate);
如果您想通过Hibernate执行此操作,则需要使用辅助列,或者您必须将其更改为Object[]
,运行转换,然后将其更改为{{1但是,这对于生产更新来说并不方便,也不是很有效,因为你在Hibernate中经历了很多层的验证和转换。
但是,如果您选择在数据库本身内部使用数组类型,那么我目前提出了一个允许它的独立模块https://github.com/hibernate/hibernate-orm/pull/1499。我们没有不能使用它的测试用例,但是如果你能找到任何需要修复的测试用例,那将有助于获得批准。