默认情况下,没有找到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());
}
}