在我的 PostgreSQL 表中,我有一个
body_parts
类型的列 json
。我想检查给定的参数是否包含在我的 json 列中。
此查询在数据库中有效:
select * from worklist_elements we
where body_parts::text like '%"CHEST"%'
但是,它在我的存储库中不起作用,我不确定,但可能是 jpql:
@Override
public List<WorklistElementView> test() {
return entityManager.createQuery(
"SELECT DISTINCT w FROM WorklistElementView w " +
"WHERE we.bodyParts::text like '%CHEST%'", WorklistElementView.class)
.getResultList();
}
是否可以使用这个查询(或另一个查询)来检查存储库中的 json 数组?
“在您的存储库中”的查询无法工作,因为表别名是
w
,但您引用了we
:
SELECT DISTINCT w FROM WorklistElementView w WHERE we.bodyParts::text like '%CHEST%'
也不确定未加引号的标识符
bodyParts
和搜索词'%CHEST%'
中的大写字母。你可能想要:
... WHERE w."bodyParts"::text ILIKE '%chest%'
参见:
但这非常昂贵且不明确。取决于“包含”的确切含义,如果您的 JSON 列实际上是 type
jsonb
(很多),则可以使用索引支持进行更高效的查询。喜欢...
“CHEST”是否作为顶级键或数组元素(而不是值)存在于 jsonb 列中?
... WHERE w."bodyParts" ? 'CHEST'
参见:
看看这个例子是否解决了它:
SELECT * , a.json->'parts'
FROM (SELECT '{"parts":"CHEST"}'::JSON as json) AS a
WHERE a.json->>'parts' = 'CHEST';
注意有两个运算符 -> 用于选择和 ->> 用于谓词。 当他们的角色混淆时,他们不起作用。