使用JPA本机查询在jsonb(JSON数组)列中进行查询

问题描述 投票:0回答:2

我正在使用 JPA,其中实体之一保存 user_details (jsonb) 列。

下面是我要查询的user_details json数组数据。

[{
    "user": "test1",
    "email": "[email protected]"
},
{
    "user": "test2",
    "email": "[email protected]"
}]

postgres 客户端,下面的查询工作得很好。

SELECT * FROM table1 WHERE "user_details" @> '[{"email": "[email protected]"}]';

在 @Repository 中我想通过本机查询实现相同的目的,其中电子邮件值([email protected])将是动态的。这是我的代码:

1. @Query(value ="select * from table1 WHERE user_details @> '[{\"email\": :email}]'", nativeQuery = true)
List<Entity> findByEmail(@Param("email") String email);

错误: json 类型的输入语法无效

详细信息:预期的 JSON 值,但发现了“:”。

其中:JSON 数据,第 1 行:[{"email": :...

2. @Query(value ="select * from table1 WHERE user_details @> '[{\"email\": ?1}]'", nativeQuery = true)
List<Entity> findByEmail(String email);

错误: json 类型的输入语法无效

细节:令牌“?”无效。

其中:JSON 数据,第 1 行:[{"email": ?...

3. @Query(value ="select * from table1 WHERE user_details @> :param", nativeQuery = true)
List<Entity> findByEmail(@Param("param") String param); (i.e. param= "'[{ \"email\" : \"[email protected]\"}]'")

错误:运算符不存在:jsonb @>字符变化

提示:没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。

编辑:

4. @Query(nativeQuery = true, value = "select * from table1 where jsonb_contains(user_details , :param )") (i.e. param= "'[{ \"email\" : \"[email protected]\"}]'")
List<Entity> findByEmail(@Param("param") String email);

错误:函数jsonb_contains(jsonb,字符变化)不存在 提示:没有函数与给定的名称和参数类型匹配。你可能会 需要添加显式类型转换。

5. @Query(nativeQuery = true, value = "select * from table1 where user_details @> jsonb_build_object('email', :param )")
List<Entity> findByEmail(@Param("param") String email);

没有错误但没有给出结果。

6. @Query(nativeQuery = true, value = "select * from table1 where user_details ->>'email' = :param")
List<Entity> findByEmail(@Param("param") String email);

没有错误但没有给出结果。

7. @Query(nativeQuery = true, value = "select * from table1 WHERE jsonb_extract_path_text(user_details , 'email') = :param")
List<Entity> findByEmail(@Param("param") String email);

没有错误但没有给出结果。

这些本机查询没有给我预期的结果。

请帮助我处理本机查询,我可以将参数与查询绑定。 预先感谢。

spring-boot jpa spring-data-jpa nativequery
2个回答
4
投票

在调用此函数之前,创建一个 jsonarray:

JSONObject obj = new JSONObject();
obj.put("email", email);
JSONArray a = new JSONArray();
a.add(0, obj);

通过传递jsonArray字符串来调用函数

findByEmail(a.toJSONString());

您的查询应该是:

@Query(nativeQuery = true, value = "select * from table1 where user_details @> cast(:param as jsonb)")
List<Entity> findByEmail(@Param("param") String email);

0
投票

{ "quoteId":2024, "quoteName":"EDE", "quoteDetails" :[ "id":3156, "元数据":[ "code":"vnf", "set": [ { "key": "abc" }, { "key":"1955" } ] ] ]

}

{ "quoteId":2025, "quoteName":"EDE2", "quoteDetails" :[ "id":3157, "元数据":[ "code":"vnf2", "set": [ { "key": "xyz" }, { "key":"2050" } ] ] ]

}

这个会查询什么。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.