首页 > 解决方案 > 在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 ..我希望有人可以帮助我或提出另一种解决方案..

标签: javahibernate

解决方案


尝试类似的东西

@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")


推荐阅读