我有一个MySQL列声明为类型JSON,我有问题,以Map它与JPA/Hibernate。我正在使用Sping Boot 后端。
下面是我的代码的一小部分:
@Entity
@Table(name = "some_table_name")
public class MyCustomEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "json_value")
private JSONArray jsonValue;
程序返回一个错误,告诉我不能Map该列。
在mysql表中,该列定义为:
json_value JSON NOT NULL;
7条答案
按热度按时间mhd8tkvw1#
Heril Muratovic's answer很好,但是我认为
JsonToMapConverter
应该实现AttributeConverter<Map<String, Object>, String>
,而不是AttributeConverter<String, Map<String, Object>>
。erhoui1w2#
在Kotlin,上述建议的以下变化/组合对我很有效:
hm2xizp93#
对于任何无法让@J. Wang回答奏效的人:
尝试添加此依赖项
创建转换器
JSONObjectConverter.java
域(实体Map)类的一部分
这个解决方案非常适合我。
qvsjd97n4#
您不必手动创建所有这些类型,只需使用以下依赖项通过Maven Central获取它们:
欲了解更多信息,请查看Hibernate Types open-source project。
现在,来解释一下它是如何工作的。
假设您有以下实体:
请注意上面代码片段中的两件事:
@TypeDef
用于定义新的自定义Hibernate类型json
,该类型由JsonType
处理properties
属性具有json
列类型,并且它被Map为String
就是这样!
现在,如果保存实体:
Hibernate将生成以下SQL语句:
您还可以重新加载并修改它:
Hibernate为您处理
UPDATE
语句:所有代码均在GitHub上提供。
l2osamch5#
我更喜欢这样做:
代码如下。
JsonToMapConverted.java
域(实体Map)类的一部分
这个解决方案非常适合我。
dsf9zpds6#
对于任何无法让@ J. Wang回答奏效的人:
尝试添加此依赖项(适用于hib5.1和5.0,其他版本检查here)
并将此行添加到实体
实体类的完整版本:
我用spring Boot 1.5.9和hibernate-types-5 1.2.0测试了这段代码。
jckbn6z77#
如果json数组中的值是简单的字符串,则可以执行以下操作: