SpringData JPA--解决将Map等集合类型映射到数据库的问题

Posted DullThinking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringData JPA--解决将Map等集合类型映射到数据库的问题相关的知识,希望对你有一定的参考价值。

1.Map集合映射到数据库

借助AtrributeConverter
目前我的需求是将集合类中的信息存储到数据库中,例如有Map字段的formBody,最好是使用JSON格式,而SpringDateJpa也为我们提供了相关的方法,通过自定义对象转换器,并通过注解的形式对需要转换的字段进行标注即可。
该接口位于javax.persistence.AtrributeConverter。我们通过自定义类实现该接口重写其中的方法实现需要的功能,本次具体的实现如下:

import com.alibaba.fastjson.JSONObject;
import javax.persistence.AttributeConverter;
/**
 * @create :Created in 2021
 * @description :Jpa映射转换器,存储时对象转JsonString, 读取时相反
 */
public class JpaConverterObjectJson implements AttributeConverter<Object, String> {
    @Override
 public String convertToDatabaseColumn(Object o) {
        return o==null?null: JSONObject.toJSONString(o);
 }
    @Override
 public Object convertToEntityAttribute(String s) {
        return s==null?null:JSONObject.parseObject(s);
 }
}

实体类中

@Entity
@DynamicUpdate
@Data
public class Item extends BaseEntity
{
   /** 物品主键 */
 @Id
 private Long itemId;
 /** 源物品信息 */
 private String sourceItemId;
 /** 物品信息 */
 @Convert(converter = JpaConverterObjectJson.class)
   @Column(columnDefinition = "TEXT")
   private Map<String,Object> itemInfo;
}

这样存的时候就是String,取出来自动为Map。

2.自动转换LIST为JSON并存储到mysql 的STRING

首先定一个一个convert,这里用阿里巴巴的fastjson

import com.alibaba.fastjson.JSON;

import javax.persistence.AttributeConverter;

public class JpaConverterListJson  implements AttributeConverter<Object, String> {
    @Override
    public String convertToDatabaseColumn(Object o) {
        return JSON.toJSONString(o);
    }

    @Override
    public Object convertToEntityAttribute(String s) {
        return JSON.parseArray(s);
    }
}

Entity里面的字段加上注解

@Convert(converter = JpaConverterListJson.class)
    @Column(columnDefinition = "TEXT")
    private List<Person> writers;

5.附录
Hibernate4学习总结(4)--注解形式的集合映射,关联关系映射
自动转换LIST为JSON并存储到MYSQL 的STRING
解决SpringJpa将Map等集合类型映射到数据库的问题

以上是关于SpringData JPA--解决将Map等集合类型映射到数据库的问题的主要内容,如果未能解决你的问题,请参考以下文章

整合SpringData JPA

JPA Map映射

Spring Data:JPA 存储库 findAll() 返回 *Map 而不是 List?

SpringData JPA实现CRUD,分页与多参数排序

解决 SpringData JPA 的n+1问题

Spring Data JPA