使用 JPA 本机查询在 jsonb (JSON 数组) 列中查询
Query in jsonb (JSON array) column with JPA native query
我正在使用 JPA,其中一个实体拥有 user_details (jsonb) 列。
下面是我要查询的user_detailsjson数组数据
[{
"user": "test1",
"email": "test1@gmail.com"
},
{
"user": "test2",
"email": "test2@gmail.com"
}]
在 postgres 客户端 中,下面的查询工作得非常好。
SELECT * FROM table1 WHERE "user_details" @> '[{"email": "test1@gmail.com"}]';
在@Repository 中我想通过本机查询实现相同的效果,其中电子邮件值 (test1@gmail.com) 将是动态的。这是我的代码:
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\" : \"test1@gmail.com\"}]'")
错误: 运算符不存在:jsonb @> 字符变化
提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
已编辑:
4. @Query(nativeQuery = true, value = "select * from table1 where jsonb_contains(user_details , :param )") (i.e. param= "'[{ \"email\" : \"test1@gmail.com\"}]'")
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);
没有错误 但没有给出结果。
这些本机查询没有给我预期的结果。
请帮助我处理本机查询,我可以在其中将参数与查询绑定。
提前致谢。
调用此函数之前,创建一个 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);
我正在使用 JPA,其中一个实体拥有 user_details (jsonb) 列。
下面是我要查询的user_detailsjson数组数据
[{
"user": "test1",
"email": "test1@gmail.com"
},
{
"user": "test2",
"email": "test2@gmail.com"
}]
在 postgres 客户端 中,下面的查询工作得非常好。
SELECT * FROM table1 WHERE "user_details" @> '[{"email": "test1@gmail.com"}]';
在@Repository 中我想通过本机查询实现相同的效果,其中电子邮件值 (test1@gmail.com) 将是动态的。这是我的代码:
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\" : \"test1@gmail.com\"}]'")
错误: 运算符不存在:jsonb @> 字符变化
提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
已编辑:
4. @Query(nativeQuery = true, value = "select * from table1 where jsonb_contains(user_details , :param )") (i.e. param= "'[{ \"email\" : \"test1@gmail.com\"}]'")
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);
没有错误 但没有给出结果。
这些本机查询没有给我预期的结果。
请帮助我处理本机查询,我可以在其中将参数与查询绑定。 提前致谢。
调用此函数之前,创建一个 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);