我需要在postgres中使用spring data jpa将实体类的两列Map为json.在阅读了多个stackoverflow post和baeldung post之后,
How to map a map JSON column to Java Object with JPA
https://www.baeldung.com/hibernate-persist-json-object
我做了如下配置。但是,我遇到错误“错误:列“headers”的类型为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
4条答案
按热度按时间dbf7pr2w1#
以上配置不起作用。
因此,我按照下面的链接来解决用例
https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/
"Provider com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule not found" after Spring Boot Upgrade
在pom.xml中添加了其他依赖项
删除了HashMapConverter配置并在实体类中进行了以下更改
进行这些更改后,TaskRepositoryTest通过。
fjaof16o2#
对于因为使用
JdbcTemplate
而登录到此处并遇到此错误的任何人,解决方案非常简单:在SQL语句中,使用::jsonb
转换JSON参数。例如,
String INSERT_SQL = "INSERT INTO xxx (id, json_column) VALUES(?, ?)";
变为String INSERT_SQL = "INSERT INTO xxx (id, json_column) VALUES(?, ?::jsonb)";
5m1hhzi43#
当我将项目从MySQL 8.0.21迁移到Postgres 13时,我遇到了这个问题。我的项目使用Sping Boot 和Hibernate类型依赖版本2.7.1。在我的情况下,解决方案很简单。
我所需要做的就是改变这一点,它起作用了。
从Hibernate Types Documentation page引用。
nlejzf6q4#
(for有一个替代的解决方案,不是完全安全的(自动从/到字符串转换),但是对于非关键的或者你控制的数据/结构应该是很好的:
将未指定的?字符串类型添加到postgresql连接字符串:
例如:(在您的应用程序.yml中)
这将使postgresql自动尝试将您的字符串转换为json。不需要任何额外的导入或@type定义或自定义sql查询,问题中的示例就是您所需要的全部:
PPS:我还没有在jsonb或其他数据库事件中尝试过。