hibernate 在PostgreSQL中使用Quarkus Panache将JSON数据存储为JSONB存储为转义字符串

xzabzqsa  于 2023-11-21  发布在  PostgreSQL
关注(0)|答案(3)|浏览(229)

我正在做一个项目,使用Quarkus与Panache和PostgreSQL,我试图将JSON数据存储为数据库中的JSONB。然而,当我将JSON数据插入数据库时,它会被转义,我想存储它而不转义,以便能够从postgress查询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;
    }
}


我正在使用最新的Panache依赖项。我如何修改我的代码或配置以在PostgreSQL中将JSON数据存储为JSONB而不转义它?请注意,即使它们被转义存储,框架也可以从数据库中读取值,但我也想用查询搜索它们,因为JSON被所有这些转义破坏了,这是不可能的

更新

我也尝试了以下情况,但结果是一样的,我得到的值在数据库中,

"{\"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;
    }


这是一个休眠错误吗?我使用的版本是6.2.7 final

dz6r00yl

dz6r00yl1#

我认为hibernate不支持字符串doc作为标准Map,尝试

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;
}

的数据
参考本文档
更新日期:
有关使用io.vertx.core.json.JsonObject的休眠响应,请参阅此post

qlzsbp2j

qlzsbp2j2#

你可以试试

@Convert(converter = ItemsConverter.class)
private JSONObject items;

字符串

@Converter
public class ItemConverter implements AttributeConverter<JSONObject, String> {
    @Override
    public String convertToDatabaseColumn(JSONObject data) {
        return data.toString();
    }

    @Override
    public JSONObject convertToEntityAttribute(String inputString) {
        JSONParser parser = new JSONParser();
        JSONObject r = new JSONObject();
        try {
            r = (JSONObject) parser.parse(inputString);
        } catch (ParseException e) {
            
        }
        return r;
    }
}

pwuypxnk

pwuypxnk3#

我认为如果类型是JSONObject而不是String,这应该可以工作。

相关问题