我正在进行一个项目,该项目使用带有Panache和PostgreSQL的Quarkus,并且我正在try 将JSON数据作为JSONB存储在数据库中.然而,当我将JSON数据插入到数据库中时,它被转义,我希望不转义地存储它,以便能够从邮局查询JSON.

下面是我插入JSON数据的代码:

JsonObject jsonObject = Json.createObjectBuilder()
        .add("name", "John")
        .add("age", 30)
        .add("city", "New York")
        .build();
String jsonString = jsonObject.toString(); // Convert JsonObject to JSON String
return update("update OfferEntity o set o.items = ?1",  jsonString).onItem().transform(ignored -> offer);


但是,在PostgreSQL数据库中,插入的字段如下所示:

"{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"

我希望将其存储为:

{"name":"John","age":30,"city":"New York"}

这是我的OfferEntity实体类:


@Entity
@Table(name = "offering")
@Cacheable
@WithSession
public class OfferEntity extends PanacheEntityBase {

    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "items", columnDefinition = "jsonb", insertable = false, updatable = false)
    private String items;

    public String getItems() {
        return items;
    }

    public void setItems(String items) {
        this.items = items;
    }
}

我用的是最新的华丽依附.如何修改我的代码或配置以在PostgreSQL中将JSON数据存储为JSONB而不进行转义?请注意,框架可以从数据库中读取值,即使它们是转义存储的,但我也想用查询来搜索它们,因为JSON被所有这些转义 destruct 了

UPDATE

我还try 了以下情况,但结果与我在数据库中获得的值相同

"{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"

我先试了一下这个

public class Item implements Serializable {
    private String name;
    private int age;
    private String city;//with getters setters
}

OfferEntity类如下所示


    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "items", columnDefinition = "jsonb", insertable = false, updatable = false)
    private Item items;

    public Item getItems() {
        return items;
    }

    public void setItems(Item items) {
        this.items = items;
    }

我还试着把物品做成 map


    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "items", columnDefinition = "jsonb", insertable = false, updatable = false)
    private Map<String, String> items;

    public Map<String, String> getItems() {
        return items;
    }

    public void setItems(Map<String, String> items) {
        this.items = items;
    }

这是Hibernate 漏洞吗?我使用的Hibernate版本是6.2.7最终版本

推荐答案

我认为Hibernate不支持将字符串doc作为标准映射,请try

public class OfferEntity extends PanacheEntityBase {

    @JdbcTypeCode(SqlTypes.JSON)
    private Map<String, String> items;
}

或者创建自己的POJO类

public class Items implements Serializable {
    private String name;
    private int age;
    private String city;
    //setters & getters
}
public class OfferEntity extends PanacheEntityBase {

    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "items", columnDefinition = "jsonb", insertable = false, updatable = false)
    private Items items;
}

请参考这doc

更新:

有关Hibernate -react 性使用io.vertx.core.json.JsonObject的信息,请参阅此post

Java相关问答推荐

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

将linkedHashMap扩展到Java中的POJO类

@ EnableRouting注释在Kotlin项目中不工作

ittext pdf延迟签名,签名无效

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

try 判断可选参数是否为空时出现空类型安全警告

把一条整型短裤和两条短裤装成一条长的

使用Jolt将字段转换为列表

如何将Java文档配置为在指定的项目根目录中生成?

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

没有使用Lombok生成的参数

如何在不作为类出现的表上执行原生查询?

在Eclipse中可以使用外部字体吗?

为什么创建Java动态代理需要接口参数

H2数据库仅支持%1个结果集?

具有多个分析模式的复杂分隔字符串的正则表达式

Java中的一个错误';s stdlib SocksSocketImpl?

为什么Instant没有从UTC转换为PostgreSQL的时区?

获取月份';s在java中非UTC时区的开始时间和结束时间

在输入端没有可行的替代方案'; Select *';