解决Hibernate JPA连接postgresQL数据库时,数组或者json类型无法映射的问题

默认情况下,没有找到hibernate直接映射pgsql的数组或者json的类型。这里使用hibernate的@TypeDefs注解自定义 TypeDescriptor

数组类型的实现具体可以参考 PostgreSQL数据库数组类型字段和Java实体对象字段值映射实现(Hibernate JPA)_菜菌的博客-CSDN博客

我这里整理了一下 字符串数组、数值数组、json、jsonb 的使用demo

首先,已经有现成的maven包可供大家使用:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>2.1.1</version>
</dependency>

然后定义实体类即可:



import com.alibaba.fastjson.JSONObject;
import com.vladmihalcea.hibernate.type.array.IntArrayType;
import com.vladmihalcea.hibernate.type.array.StringArrayType;
import com.vladmihalcea.hibernate.type.json.JsonBinaryType;
import com.vladmihalcea.hibernate.type.json.JsonStringType;
import lombok.Data;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;

import javax.persistence.*;

/**
 * @description: Hibernate Jpa连接postgresQL
 * @author: H2103424
 * @createTime: 2022/6/14 下午 07:22
 **/
@Data
@Entity
@Table(name = "parents")
@TypeDefs({
        @TypeDef(name = "string-array", typeClass = StringArrayType.class),
        @TypeDef(name = "int-array", typeClass = IntArrayType.class),
        @TypeDef(name = "json", typeClass = JsonStringType.class),
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
public class TestEntity implements Serializable {

    @Id
    @SequenceGenerator(name = "machine_info_seq", sequenceName = "t_machine_info_machine_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "machine_info_seq")
    @Column(name = "machine_id")
    private Long machineId;

    @Column(name = "machine_no")
    private String machineNo;

    @Column(name = "machine_attr")
    @Type(type = "jsonb")
    private JSONObject machineAttr;

    @Column(name = "group_code")
    @Type(type = "string-array")
    private String[] groupCode;
}

字符串数组使用 String[],jsonb类型,我使用的 com.alibaba.fastjson.JSONObject,其它兼容类型应该也可以,大家自行尝试。此时取值:

 

保存的时候直接将 JSONObject 放入对应属性即可。

JSONObject obj = JSONObject.parseObject("{\"MinioBucket\":\"cardlog\"}");
entity.setMachineAttr(obj);
machineInfoService.save(entity);

 如果是web前端传过来的json,可在前端使用 JSON.stringify() 转为字符串。

            let param = {
                'machineNo' : iMachineNo,
                'machineName' : iMachineName,
                'machineType' : iMachineType,
                'factory' : iFactory,
                'machineIp' : $('#iMachineIp').val(),
                'machineMac' : $('#iMachineMac').val(),
                'groupCode' : $('#iGroupCode').val(),
                'position' : $('#iPosition').val(),
                'status' : $('#iStatus').val(),
                'random' : Math.random(),
                'machineAttr':JSON.stringify({"MinioBucket": "cardlog"}),
                'checkAttr':JSON.stringify({"MinioBucket": "cardlog"})
            };
            $.ajax({
                url : ctx + "/machineGroup/add",
                type : "POST",
                data : param,
                success:function(res){
                    layer.msg(res.msg);
                    if(res.success){
                        queryList();
                        closeAddWin();
                    }
                }
            });

Controller:

    @PostMapping("add")
    public ResultObj add(MachineInfoEntity entity,String machineAttrStr,String checkAttrStr) {
        try {

            JSONObject machineAttrObj = JSONObject.parseObject(machineAttrStr);
            System.out.println(machineAttrObj);
            entity.setMachineAttr(machineAttrObj);
            JSONObject checkAttrObj = JSONObject.parseObject(checkAttrStr);
            System.out.println(checkAttrObj);
            entity.setCheckAttr(checkAttrObj);

            return machineInfoService.save(entity);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("保存設備信息異常("+entity.getMachineNo()+"):" + e.getMessage(), e);
            return new ResultObj(false, "保存設備信息異常:"+e.getMessage());
        }

    }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值