我需要使用SpringDataJPA将实体类的两列映射为postgres中的json。阅读多个stackoverflow post和baeldung post后,
如何使用JPA将MapJSON列映射到Java对象
https://www.baeldung.com/hibernate-persist-json-object
我做了如下配置。但是,我面临错误"ERROR:列"标题"是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
当我将我的项目从MySQL 8.0.21迁移到Postgres 13时,我遇到了这个问题。我的项目使用带有Hibernate类型依赖项版本2.7.1的Spring Boot。就我而言,解决办法很简单。
我所需要做的就是改变这一点,它奏效了。
引用自Hibernate类型文档页。
对于那些因为使用JdbcTemboard
而出现此错误的人来说,解决方法非常简单:在SQL语句中,使用::jsonb
转换JSON参数。
字符串INSERT_SQL="INSERT INTO xxx(id,json_column)VALUES(?, ?)";变为StringINSERT_SQL="INSERT INTO xxx(id,json_column)VALUES(?,?::jsonb)";
上述配置不起作用。
因此,我遵循下面的链接来解决这个用例
https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/
Spring Boot升级后“未找到提供程序com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule”
在pom中添加了其他依赖项。xml
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.9.11</version>
</dependency>
删除了HashMapConverter配置,并对实体类进行了以下更改
@Entity
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@TypeDefs({
@TypeDef(name = "json", typeClass = JsonStringType.class),
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
public class Task {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
private String url;
private String httpMethod;
@Type(type = "jsonb")
@Column(columnDefinition = "json")
private Map<String, String> headers;
@Type(type = "jsonb")
@Column(columnDefinition = "json")
private Map<String, String> urlVariables;
}
在这些更改之后,TaskRepositoryTest通过了。
在Spring Boot的一个项目中,Java8使用hibernate-spatial和PostgresDB 9.4 应用程序属性 (我也尝试了PostgisPG9Dialect) 我的实体有一个属性 如果我用空值保存就可以了,但是如果我放一个值 我有: 在我的数据库中,我可以看到列定义为 我要疯了...为什么它不起作用? 更新(仍然不起作用,我正在收集新信息) 1)我认为问题可能是数据库的创建。
这是我的实体类,映射到(9.4)中的一个表。我正在尝试将元数据存储为数据库中的类型 这是元数据类: 我使用以下迁移文件添加了列: 在中创建记录时出现此错误:错误:列“metadata”的类型为,但表达式的类型为提示:您需要重写或强制转换表达式。 这是我试图在db中持久化的请求主体: 请帮助如何转换类型为在javaSpring启动应用程序
我正在尝试使用nifi将CSV记录插入Postgres数据库。 示例csv文件: 当nifi场景运行时,它会给出以下错误 错误列“timenow”的类型为timestamp,没有时区,但表达式的类型为character variating 如果我使用正常的 没有错误值插入到表中。我必须更改nifi配置才能将其添加到表中吗? 我换了Nifi CSVReader- 编辑:在第一条注释之后,Nifi生成
问题内容: 在不同数据库之间进行切换时,关于包含大对象(BLOB)的hibernate映射,我有一个奇怪的问题。 上面的字段在MySQL和Oracle中创建一个字节数组字段,但是在PostreSQL中,它创建一个oid类型的字段。 现在,当我尝试访问该字段时,它在其他数据库中也能正常工作,但是在PostgreSQL中,它失败并显示以下错误 因此,我试图简单地删除“ @Lob”注释,这将解决Post
我是爪哇的新手。我不明白为什么会发生这些错误。尝试创建一个数组列表,以便它保存每个对象。我得到的错误是 表达式的类型必须是数组类型,但它解析为数组列表上的行“newbug1[i].setpecies();” 提前致谢
将异常获取为 :lambda表达式中的返回类型错误: