有人成功地将PostgreSQL中的数字数组Map到Java中的数字数组了吗?
SQL:
CREATE TABLE sal_emp (name text, pay_by_quarter integer[]);
INSERT INTO sal_emp VALUES ('one', '{1,2,3}');
INSERT INTO sal_emp VALUES ('two', '{4,5,6}');
INSERT INTO sal_emp VALUES ('three', '{2,4,6}');
Map:
<hibernate-mapping>
<class name="SalEmp" table="sal_emp">
<id name="name" />
<property name="payByQuarter" column="pay_by_quarter" />
</class>
</hibernate-mapping>
班级:
public class SalEmp implements Serializable{
private String name;
private Integer[] payByQuarter;
...// getters & setters
}
查询表时出现异常。
6条答案
按热度按时间gz5pxeao1#
Maven依赖
您需要做的第一件事是在项目
pom.xml
配置文件中设置以下Hibernate Types Maven依赖项:假设您的数据库中有这个表:
您想要这样Map它:
string-array
和int-array
是可以在BaseEntity
超类中定义的自定义类型:StringArrayType
和IntArrayType
是由Hibernate Types项目提供的类。测试时间
现在,当你插入几个实体时;
Hibernate将生成以下SQL语句:
gcmastyq2#
Hibernate不支持开箱即用的数据库阵列(例如Map到
java.sql.Array
的阵列)。Hibernate提供的
array
和primitive-array
类型用于将Java数组Map到备份表-它们基本上是一对多/元素集合Map的变体,所以这不是您想要的。不过,最新的PostgreSQL JDBC驱动程序(无论什么)都支持JDBC4
Connection.createArrayOf()
方法以及ResultSet.getArray()
和PreparedStatement.setArray()方法,因此您可以编写自己的UserType
来提供数组支持。Here是一个处理Oracle数组的UserType实现,它提供了一个很好的起点,改编它来处理
java.sql.Array
是相当简单的。57hvy0tb3#
也许这对其他人很有用:我发现在我的情况下,它的性能很差,不能与C3P0一起使用。(只是简单地探讨了这些问题,能不能解决,请指正!)
Hibernate 3.6:
ds97pgxw4#
这已经针对字符串数组进行了测试。对于数字数组,可能需要对转换器进行一些修改。这可以与Spring JPA一起使用。
1)将
PostgreSQLTextArray
添加到您的项目2)将
ListToArrayConverter
添加到代码中3)使用它!
5kgi1eie5#
通过发布here的JPA Converter方法,我能够将
String[]
保存到PostgreSQL 9.4和NikpseLink 2.6.2这似乎是答案的来源
2016年7月1日TK421号。
从数据库加载数组也很有效。
额外添加到
persistence.xml
我的ListToArrayConverter路径:请注意,Postgre JDBC驱动程序中不再包含
Jdbc4Array
,请改用:查看此处:Package org.postgresql.jdbc4 is missing since 9.4-1207
lokaqttq6#
下面是我使用的
int[]
UserType,它还包括对nullSafeGet()
和nullSafeSet()
的NULL检查: