jpa + MySQL list转String存入数据库

本文探讨了在使用JPA时遇到的问题,即如何将List对象转换为String存储到MySQL数据库中。针对不同类型的List内容,如自定义对象Point(表示位置坐标)和基本数据类型集合,提出了使用数据类型转换和自定义转换器的方法。在POJO类中定义转换器可以避免Hibernate为集合创建单独的表,确保数据正确存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

问题

list通过jpa直接存入数据库会报错这里需要进行转换

思考

  • list中存放的自定义对象为Point等一类位置坐标,可以使用POINT、MULTIPOINT等空间类型的字段
    MySQL数据类型

  • list中存放的是基本数据或者自定义基本数据的集合
    在POJO类中定义转换器

@Entity
@Data
public class MyClass{
    @Convert(converter = JpaConverterListJson.class)
    private List<MyList> positions;
}

对于List中为基本类型的数据,使用的转换方式

import com.alibaba.fastjson.JSON;
import javax.persistence.AttributeConverter;
/**
 * @ClassName JpaConverterListJson
 * @Description jpa list转换为test 相互转换工具类
 * @Author ygt
 * @Date 2021/3/3 14:49
 * @Version V1.0
 */
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);
    }
}

对于List中为基本类型集合的数据,使用的转换方式

import com.alibaba.fastjson.JSON;
import javax.persistence.AttributeConverter;
/**
 * @ClassName JpaConverterListJson
 * @Description jpa list转换为test 相互转换工具类
 * @Author ygt
 * @Date 2021/3/3 14:49
 * @Version V1.0
 */
public class JpaConverterListJson  implements AttributeConverter<List<MyList>, String> {
    @Override
    public String convertToDatabaseColumn(List<MyList> o) {
        return JSON.toJSONString(o);
    }

    @Override
    public List<MyList> convertToEntityAttribute(String s) {
        return JSON.parseArray(s, MyList.class);
    }
}

这样就可以在数据库中存入List转换的Json数据

参考

P.S.
在POJO类中定义转换器时,如果使用注解@ElementCollection,Hibernate在存储数据时会自动为该集合单独创建一张表,这个表包含一个指向该属性所在类ID的外键。

@Entity
@Data
public class MyClass{
    @Convert(converter = JpaConverterListJson.class)
    @ElementCollection
    private List<MyList> positions;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值