Hibernate将Postgres数据库中现有的Integer []转换为String [](bytea)

时间:2017-01-05 08:21:37

标签: java spring postgresql hibernate

我正在使用Spring,Hibernate和Postgres。 在我的一个模型课中,我有:

��ur[Ljava.lang.Integer;������xpsr...

它已被使用,我在数据库中有上述格式的数据。

“data”字段是bytea(在phppgadmin中可见)类型,db中保存的示例值之一是:

String[] data;

问题是现在我需要将模型更改为

File::open

但是当我这样做时,Hibernate无法读取这些数据,因为它的类型为Integer。

我的问题 - 是否有可能将这些Integer数组对象转换为String数组对象?使用一些db工具,sql查询还是Hibernate?

1 个答案:

答案 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。我们没有不能使用它的测试用例,但是如果你能找到任何需要修复的测试用例,那将有助于获得批准。