Использование поля json в сущности jpa (реализация hibernate UserType) - PullRequest
0 голосов
/ 02 февраля 2019

Надеюсь, вы мне поможете .. У меня есть сущность:

@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 (hibernate) и помещается в БД в формате json (объект json с записями значения ключа)

Я не знаю, какие поля будут помещены в поле дополнительных данных json (ключи определяются пользователем) ..
Я сохраняю в дБ, например ...

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 голосов
/ 02 февраля 2019

Попробуйте что-то вроде

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...