首页 > 解决方案 > sql, javax.persistence.criteria:检查一个用逗号分隔的字符串值与字符串列表的数据库表列

问题描述

我有一个带有逗号分隔的字符串值的数据库表列,如下所示:

id mycolumn
-- --------
1  A
2  A, B
3  A, B, C

我无法更改它,因为它是一个旧的定制器数据库。

我想检查mycolumn一个字符串列表:

对列表['A'] 的第一个查询应返回记录1

针对列表['A','B'] 的第二个查询应返回记录1,2

针对列表['A','B','C'] 的第三个查询应返回记录1,2,3

我需要一个 sql (postgres) 语句和一个带有javax.persistence.criteria.CriteriaBuilderand的 java 实现javax.persistence.criteria.Predicate

非常感谢你的提示,安

编辑: 这是我对 javax.persitence 部分的解决方案:

public static void arrayContains(final CriteriaBuilder cb, final List<Predicate> where,
            final Expression<String> expression, final String values) {
        Expression<String> expressionValues = cb.function("string_to_array", String.class, cb.literal(values), cb.literal(", "));
        Expression<String> expressionDb = cb.function("string_to_array", String.class, expression, cb.literal(", "));
        where.add(cb.isTrue(cb.function("arraycontains", Boolean.class, expressionValues, expressionDb)));
    }

标签: javasqldatabasepostgresqljavax.persistence

解决方案


在 PostgreSQL中,在带有包含运算符string_to_array(mycolumn,',')的子句中使用,例如WHERE<@

SELECT * FROM t
WHERE string_to_array(mycolumn,',') <@ ARRAY['A','B','C']

请记住,您必须创建与此条件相对应的索引,以防您处理大型表,例如GIN索引。

CREATE INDEX idx_t_mycolumn_gin ON t USING gin (string_to_array(mycolumn,','));

演示:db<>fiddle


推荐阅读