当前位置: 首页 > 面试题库 >

将PostgreSQL JSON列映射到Hibernate值类型

狄峰
2023-03-14
问题内容

我的PostgreSQL数据库(9.2)中有一个表,其中的列类型为JSON。我很难将此列映射到“ JPA2实体”字段类型。

我尝试使用String,但是当我保存实体时,出现一个异常,即它无法将字符转换为JSON。

处理JSON列时使用的正确值类型是什么?

@Entity
public class MyEntity {

    private String jsonPayload; // this maps to a json column

    public MyEntity() {
    }
}

一个简单的解决方法是定义一个文本列。


问题答案:

请参阅PgJDBC错误#265。

PostgreSQL过于严格,对数据类型转换非常严格。它text甚至不会隐式转换为像xml和这样的文本值json

解决此问题的严格正确方法是编写一个使用JDBC
setObject方法的自定义Hibernate映射类型。这可能有点麻烦,因此您可能只想通过创建较弱的强制转换来使PostgreSQL的严格性降低。

正如@markdsievers在评论和本博文中指出的那样,此答案中的原始解决方案绕过了JSON验证。因此,这并不是您真正想要的。写起来更安全:

CREATE OR REPLACE FUNCTION json_intext(text) RETURNS json AS $$
SELECT json_in($1::cstring); 
$$ LANGUAGE SQL IMMUTABLE;

CREATE CAST (text AS json) WITH FUNCTION json_intext(text) AS IMPLICIT;

AS IMPLICIT 告诉PostgreSQL它可以转换而无需显式通知,从而允许类似的工作:

regress=# CREATE TABLE jsontext(x json);
CREATE TABLE
regress=# PREPARE test(text) AS INSERT INTO jsontext(x) VALUES ($1);
PREPARE
regress=# EXECUTE test('{}')
INSERT 0 1

感谢@markdsievers指出问题。



 类似资料:
  • 问题内容: 我需要将两个表映射到一个类,但很难弄清楚。一个表是ROOMS,另一个表是TRAINERS。 ROOMS表: 培训人员表: 表应当加入了,和。 ROOMS表的主键是:。TRAINERS表的主键是:。 我需要通过查询这个数据,,,,和。 在SQL中,可能类似于: 我正在项目中其他地方使用ROOMS表,它已经映射为独立对象。是否有一种方法可以将其用作TRAINERS对象的子对象,或者将这两个

  • 问题内容: 我的PostgreSQL数据库(9.2)中有一个表,其中的列类型为JSON。我很难将此列映射到“ JPA2实体”字段类型。 我尝试使用String,但是当我保存实体时,出现一个异常,即它无法将字符转换为JSON。 处理JSON列时使用的正确值类型是什么? 一个简单的解决方法是定义一个文本列。 问题答案: 请参阅PgJDBC错误#265。 PostgreSQL过于严格,对数据类型转换非常

  • 帮助我解决我的问题...当我使用方法时,我在映射方面遇到了问题。 型号:Bus Bus\U id pk号 驱动程序driver_idpk名称 巴士司机bus_idfkdriver_idfk 巴士 驾驶员 1级-驾驶员: 2类-总线公共类BusDAOImpl实现BusDAO{ 我的映射: 主类: } hibernate.cfg 工厂 HibernateUtil: 错误文本:

  • 问题内容: 我正在寻找有关如何在Python中将一个范围值转换为另一范围值的想法。我正在从事硬件项目,正在从可返回一定范围值的传感器读取数据,然后使用该数据来驱动需要不同范围值的执行器。 例如,假设传感器返回的值在1到512的范围内,并且执行器由5到10的值驱动。我想要一个函数,我可以传递一个值和两个范围并取回该值映射到第二个范围。如果这样的函数被命名,则可以这样使用: 在此示例中,我希望输出为,

  • 问题内容: 我有一个FlagsAttribute按位枚举,像这样- 现在,在C#中,我将此值存储在一个名为MyProperty的属性中,并保存后将此属性写入我的SQL数据库的整数列中。假设如果我从代码中选择,那么它将在数据库中另存为。 我知道我可以从数据库获取值,只需要将int值类型转换为MyEnum,它将为我提供这些值。但是,我希望对某些存储过程中的SQL数据执行一些操作,在这些存储过程中,显然

  • 我需要将枚举列表映射到Postgres中的表。 对于1:1关系的一般映射,我发现这篇文章非常有用。代码如下所示: 但是如果是一个,那么我就可以轻松地找到一个解决方案。因为定义失败了。 为了使其具体化:我有一个表,例如,我可以在其中存储和。为了示例起见,我可以存储多个(例如,基于时间的)。那么如何正确地定义它,如果我有 以同样的方式定义它的方法会导致异常(这似乎很清楚,因为注释是针对而不是针对)