【发布时间】:2021-04-05 06:26:33
【问题描述】:
我需要使用spring data jpa在postgres中将实体类的两列映射为json。在阅读了多个stackoverflow帖子和baeldung帖子后,
How to map a map JSON column to Java Object with JPA
https://www.baeldung.com/hibernate-persist-json-object
我做了如下配置。但是,我面临错误“错误:列“标题”是 json 类型,但表达式的类型是字符变化”
请提供一些指针来解决此问题。
我有一个实体类如下
@Entity
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class Task {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
private String url;
private String httpMethod;
@Convert(converter = HashMapConverter.class)
@Column(columnDefinition = "json")
private Map<String, String> headers;
@Convert(converter = HashMapConverter.class)
@Column(columnDefinition = "json")
private Map<String, String> urlVariables;
}
我创建了一个测试类来测试实体是否被持久化。在运行这个 junit 时,下面的测试用例失败,错误如下
@SpringBootTest
class TaskRepositoryTest {
private static Task randomTask = randomTask();
@Autowired
private TaskRepository taskRepository;
@BeforeEach
void setUp() {
taskRepository.deleteAll();
taskRepository.save(randomTask);
}
public static Task randomTask() {
return randomTaskBuilder().build();
}
public static TaskBuilder randomTaskBuilder() {
Map<String,String> headers = new HashMap<>();
headers.put(randomAlphanumericString(10),randomAlphanumericString(10));
Map<String,String> urlVariables = new HashMap<>();
urlVariables.put(randomAlphanumericString(10),randomAlphanumericString(10));
return builder()
.id(randomPositiveInteger())
.httpMethod(randomAlphanumericString(10))
.headers(headers)
.urlVariables(urlVariables)
.url(randomAlphanumericString(10)));
}
}
使用 liquibase,我在 postgres DB 中创建了表,我可以看到列数据类型为 json。
databaseChangeLog:
- changeSet:
id: 1
author: abc
changes:
- createTable:
tableName: task
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
- column:
name: url
type: varchar(250)
constraints:
nullable: false
unique: true
- column:
name: http_method
type: varchar(50)
constraints:
nullable: false
- column:
name: headers
type: json
- column:
name: url_variables
type: json
rollback:
- dropTable:
tableName: task
【问题讨论】:
-
这看起来像一个字符串,而不是 json:headers.put(randomAlphanumericString(10),randomAlphanumericString(10));
-
@Frank Heikens 是的,这是地图,但 HashMapConverter.class 应在写入 DB 之前将实体属性转换为 json。
-
在你提到的教程中使用
Map<String, Object>,而你使用Map<String, String> -
@NikolaiShevchenko 因为我的要求是 Map
而不是 Map -
@user2800089 那么你应该调整HashMapConverter来处理
Map<String,String>
标签: json postgresql spring-boot spring-data-jpa liquibase