H2 数据库 Json 字段 Hibernate 转换器异常
H2 Database Json Field Hibernate Converter Exception
我只是尝试在 h2 中插入一个 json 值。然后我想用休眠转换器取回这个 json 值作为对象。但错误如下所示:
我的插入查询是:
INSERT INTO log(
id, activities, date)
VALUES (1, '[{"actionType": "EMAIL"}]', '2019-12-10 00:00:00');
当我试图用休眠转换器取回这个字段时,字段带有引号:
"[{"actionType": "EMAIL"}]"
但应该是:
[{"actionType": "EMAIL"}]
org.springframework.dao.InvalidDataAccessApiUsageException: 给定的字符串值:“[{"actionType": "EMAIL"}]”无法转换为Json对象;嵌套异常是 java.lang.IllegalArgumentException:给定的字符串值:“[{"actionType": "EMAIL"}]”无法转换为 Json 对象
实体:
@Entity
@Table(name = "log")
public class RuleLog
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Convert(converter = LogActionConverter.class)
private List<LogActivity> activities;
@Column(name = "date")
private LocalDateTime date;
}
转换器:
public class LogActionConverter implements AttributeConverter<List<LogActivity>, String>
{
private static final Gson gson = new Gson();
@Override
public String convertToDatabaseColumn(List<LogActivity> attribute)
{
try
{
if (attribute == null)
{
return null;
}
else
{
return gson.toJson(attribute);
}
}
catch (Exception ex)
{
return null;
}
}
@Override
public List<LogActivity> convertToEntityAttribute(String dbData)
{
try
{
if (dbData == null)
{
return null;
}
else
{
return gson.fromJson(dbData, List.class);
}
}
catch (Exception ex)
{
return null;
}
}
}
因为已经在 H2 的 GitHub, the cast from a character string to a JSON creates a JSON String object. JSON text should either have a standard FORMAT JSON
clause or be specified as a non-standard JSON literal 上回答了。
-- SQL:2016 compliant
'[{"actionType": "EMAIL"}]' FORMAT JSON
-- or H2-specific
JSON '[{"actionType": "EMAIL"}]'
我只是尝试在 h2 中插入一个 json 值。然后我想用休眠转换器取回这个 json 值作为对象。但错误如下所示:
我的插入查询是:
INSERT INTO log(
id, activities, date)
VALUES (1, '[{"actionType": "EMAIL"}]', '2019-12-10 00:00:00');
当我试图用休眠转换器取回这个字段时,字段带有引号:
"[{"actionType": "EMAIL"}]"
但应该是:
[{"actionType": "EMAIL"}]
org.springframework.dao.InvalidDataAccessApiUsageException: 给定的字符串值:“[{"actionType": "EMAIL"}]”无法转换为Json对象;嵌套异常是 java.lang.IllegalArgumentException:给定的字符串值:“[{"actionType": "EMAIL"}]”无法转换为 Json 对象
实体:
@Entity
@Table(name = "log")
public class RuleLog
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Convert(converter = LogActionConverter.class)
private List<LogActivity> activities;
@Column(name = "date")
private LocalDateTime date;
}
转换器:
public class LogActionConverter implements AttributeConverter<List<LogActivity>, String>
{
private static final Gson gson = new Gson();
@Override
public String convertToDatabaseColumn(List<LogActivity> attribute)
{
try
{
if (attribute == null)
{
return null;
}
else
{
return gson.toJson(attribute);
}
}
catch (Exception ex)
{
return null;
}
}
@Override
public List<LogActivity> convertToEntityAttribute(String dbData)
{
try
{
if (dbData == null)
{
return null;
}
else
{
return gson.fromJson(dbData, List.class);
}
}
catch (Exception ex)
{
return null;
}
}
}
因为已经在 H2 的 GitHub, the cast from a character string to a JSON creates a JSON String object. JSON text should either have a standard FORMAT JSON
clause or be specified as a non-standard JSON literal 上回答了。
-- SQL:2016 compliant
'[{"actionType": "EMAIL"}]' FORMAT JSON
-- or H2-specific
JSON '[{"actionType": "EMAIL"}]'