jsonb字段上的Spring-Data-JPA本机查询

时间:2018-07-05 15:40:04

标签: postgresql spring-data-jpa jsonb

给出以下以jsonb存储在Postgres表中的JSON:

{
    "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"}]}}';

但是,当我尝试在JPARepository上使用本机查询在Spring-Data-JPA中复制此查询时,我不断收到以下异常:

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
}

其他调用该实体的查询可以与绑定到MyJson实体的jsonb字段一起正常工作。有办法使这项工作吗?

1 个答案:

答案 0 :(得分:0)

您必须在本地查询中强制转换值。

cast(:uuid as UUID)

您的查询就会变成

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