2017-01-05 24 views
0

我正在使用Spring,Hibernate和Postgres。 在我的模型类的我有:休眠在Postgres数据库中将现有Integer []转换为String [](bytea)

@Entity 
class SomeData { 
    private Long dataId; 
    private String name; 
    private Integer[] data; 
} 

它已经使用,我在上面的格式数据库具有数据。

“数据”字段是一个BYTEA(在phpPgAdmin的可见)类型,保存在DB中的示例值中的一个是:

​​

问题是,现在我需要改变模型

String[] data; 

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

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

+0

也许这可以帮助吗? http://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/ –

+0

或者在你的''setData()''方法中,包含将''Integer [] ''to''String []'' –

+0

@DonaldWu但我的问题是已经保存在数据库中的多个条目是以Integer数组类型以及如何将它们转换为String数组类型? – user3626048

回答

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[],运行转换,然后将其更改为String[],但是这不便于生产更新,效率也不高,因为您会在Hibernate内部进行许多验证和转换。但是,如果你选择在数据库本身内部使用数组类型,我有一个独立的模块,目前建议允许它https://github.com/hibernate/hibernate-orm/pull/1499。我们没有不适用的测试用例,但是如果您能找到需要修复的测试用例,这将有助于获得批准。

相关问题