Собственный запрос Spring-Data-JPA для поля jsonb - PullRequest
0 голосов
/ 05 июля 2018

Учитывая следующий JSON, который хранится как jsonb в таблице postgres:

{
    "object" : {
        "array" [
            {
                "uuid" : "34ad3558-a3e7-43d0-826f-afddce255b20"
            }
        ]
    } 
}

У меня есть рабочий запрос для поиска, если в документе JSON присутствует значение field:

select * from my_table 
where my_json@>'{"object": {"array" : [{"field": "34ad3558-a3e7-43d0- 
826f-afddce255b20"}]}}';

Однако, когда я пытаюсь реплицировать этот запрос в Spring-Data-JPA, используя собственный запрос в JPARepository, я получаю следующее исключение:

org.springframework.dao.InvalidDataAccessApiUsageException: Parameter with that position [1] did not exist

Я изначально попробовал:

@Query(value = "Select * From my_table"
     + "and my_json@>'{\"object\": {\"array\" : [{\"uuid\": \"?1\"}]}}'",
    nativeQuery = true)
Set<MyEntity> myQuery(UUID uuid);

После этого я попытался связать параметр с @Param:

@Query(value = "Select * From my_table"
     + "and my_json@>'{\"object\"\\: {\"array\" \\: [{\"uuid\"\\: \":uuid\"}]}}'",
    nativeQuery = true)
Set<MyEntity> myQuery(@Param("uuid") UUID uuid);

После этого я попытался преобразовать UUID в строку:

@Query(value = "Select * From my_table"
     + "and my_json@>'{\"object\"\\: {\"array\" \\: [{\"uuid\"\\: \":uuid\"}]}}'",
    nativeQuery = true)
Set<MyEntity> myQuery(@Param("uuid") String uuid);

Все еще ничего не работает. Сущность JPA выглядит следующим образом:

@Entity
public class MyEntity {

    @Id
    private long id;

    @Column("my_json")
    private MyJson myJson
}

Другие запросы, которые задействуют сущность, прекрасно работают с привязкой поля jsonb к сущности MyJson. Есть ли способ сделать эту работу?

1 Ответ

0 голосов
/ 05 июля 2018

Вы должны привести значение в свой собственный запрос.

cast(:uuid as UUID)

Итак, ваш запрос становится.

@Query(value = "Select * From my_table"
 + "and my_json@>'{\"object\"\\: {\"array\" \\: [{\"uuid\"\\: cast(:uuid as UUID)}]}}'",
nativeQuery = true)
...