在JPA实体使用JSON场(实现休眠用户类型)

时间:2019-02-02 16:56:10

标签: java hibernate

希望您能帮助我。 我有一个实体:

@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格式(具有键值条目JSON对象)

我不知道什么字段将被(密钥由用户定义的)放置在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()..但是在运行时,我对字段名一无所知)中的数据。 我希望有人能帮助我或提出其他解决方案。

1 个答案:

答案 0 :(得分:0)

尝试类似

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