java - 在jpa实体中使用json字段(实现hibernate UserType)
问题描述
我希望你能帮助我..我有一个实体:
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String name;
@Type(type = "JsonDataUserType")
@Column
private Map<String, Object> additionalData;
//.....
// some data
}
JsonDataUserType 实现 UserType 接口(休眠)并以 json 格式(带有 key-value 条目的 json 对象)放置在 db 中
我不知道additionalData json字段中将放置哪些字段(键由用户定义)..
我保存在db中,例如...
Person person1 = new Person();
person1.getAdditionalData().put("age", 15);
person1.getAdditionalData().put("gender", "male");
person1.getAdditionalData().put("position", "something");
// .. save to db
Person person2 = new Person();
person2.getAdditionalData().put("height", 180);
person2.getAdditionalData().put("nick name", "hahaha");
person2.getAdditionalData().put("slogan", "I'm not stupid");
// .. save to db
在我想进行如下查询之后:
select p from Person p where p.additionalData.slogan = :slogan...
我怎样才能进行类似的查询?Hibernate 的文档说我应该实现 CompositeUserType 以便在标准 jpql/hql 中使用自定义用户类型,但我还必须实现 getPropertyNames() 和 getPropertyTypes() .. 但在运行时我对字段名称(键)一无所知)在additionalData ..我希望有人可以帮助我或提出另一种解决方案..
解决方案
尝试类似的东西
@Query("select p from Person p where p.additionalData->>':key' = :value")
List<Person> findByKeyValue(@Param("key") String key, @Param("value") Object value) {
}
您现在可以将其称为repository.findByKeyValue("height", 180)
或repository.findByKeyValue("slogan", "I'm not stupid")
推荐阅读
- mysql - 如何使用带有 spring/hibernate 的 Java 在我的数据库中正确插入日期(在我的数据库中获取错误的时间)?
- ruby-on-rails - 在 Rails 中将 devise-jwt 添加到现有用户模型时的问题
- sql - Query as number parameter inside another query
- python - 无法导入模块
- css - 用循环从左到右为文本加下划线
- node.js - 电子js在渲染器之间传递变量
- macos - 在 macOS Catalina 下的 Finder 中查找活动壁纸文件的脚本
- azure - Azure 数据工厂:复制数据活动始终从 REST 或 HTTP 源数据集返回错误
- python - 从 CSV 读取时,在 Dask 中添加索引列的方法是什么?
- javascript - 使用 jquery 在表格的单元格列中创建引导按钮