栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

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


    com.vladmihalcea
    hibernate-types-52
    2.1.1

然后定义实体类即可:


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.*;


@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());
        }

    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/972870.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号