我的PostgreSQL DB(9.2)中有一个带有JSON类型列的表.我很难将此列映射到JPA2实体字段类型.
我试图使用String,但是当我保存实体时,我得到一个异常,它无法将字符转换为JSON.
处理JSON列时使用的正确值类型是什么?
@Entity
public class MyEntity {
private String jsonPayload; // this maps to a json column
public MyEntity() {
}
}
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方法是定义文本列.
特别是我对使用PostgreSQLs json类型感兴趣.
问题的核心似乎是Eclipselink中没有内部映射来json 键入.因此,使用一种天真的方法:
@Column(name = "json", columnDefinition = "json")
public String getJson() {
return json;
}
Run Code Online (Sandbox Code Playgroud)
...并尝试插入一个对象,我得到一个例外:
Internal Exception: org.postgresql.util.PSQLException: ERROR: column "json" is of type json but expression is of type character varying
Run Code Online (Sandbox Code Playgroud)
我觉得很公平.
通过EclipseLink文档,似乎适用的自定义(转换映射,本机查询,转换器)依赖于由支持的映射(数字,日期,字符串等)组成的数据,因此使得使用它变得非常尴尬供应商特定类型.
这是如此令人沮丧的主要原因是jsonposgresql 中的类型表达与text/varchar相同,我相信(目前,但不是永远)只是该类型的别名 - 因此驱动程序能够传输这个,这只是我的验证规则.
就解决方案而言,我不介意丢失可移植性(在数据库不可知和使用供应商特定类型方面),但只是想要一个允许我json在普通JPA实体上使用类型作为属性并保留所有它习惯的其他行为(模式生成,合并,持久化,事务代码
我们使用spring框架jdbcTemplate来插入数据如下:
Object[] params = {"978","tour"};
jdbcTemplate.update("insert into test1 values (?,?)", params);
Run Code Online (Sandbox Code Playgroud)
但这给出了例外:
org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback; 错误的SQL语法[插入test1值(?,?)]; 嵌套异常是org.postgresql.util.PSQLException:错误:列"id"的类型为整数,但表达式的类型为字符变化 ERROR:列"id"的类型为整数但表达式的类型为字符变化
这适用于通过隐式类型转换的Oracle数据库,但postgres似乎不会那样工作.
这可能是postgres驱动程序的问题吗?
解决方法是显式转换:
insert into test1 values (?::numeric ,?)
Run Code Online (Sandbox Code Playgroud)
但是有更好的方法来进行转换,因为这似乎不是一个好的解决方案,因为有很多查询需要修改,而且还可能存在其他类似的转换问题.
是否有一些参数可以在DB级别设置以执行自动转换?
postgresql ×3
jpa ×2
json ×2
casting ×1
database ×1
eclipselink ×1
hibernate ×1
java ×1
jdbc ×1
jdbctemplate ×1