sql、javax.persistence.criteria:根据字符串列表检查数据库 table 列,其中包含逗号分隔的字符串值
sql, javax.persistence.criteria: check a database table column with comma separated string values against a list of strings
我有一个数据库 table 列,其中包含逗号分隔的字符串值,如下所示:
id mycolumn
-- --------
1 A
2 A, B
3 A, B, C
我无法更改它,因为它是旧的定制程序数据库。
我想根据字符串列表检查 mycolumn
:
第一次查询列表 ['A'] 应该是 return 记录 1
针对列表 ['A','B'] 的第二个查询应该是 return 条记录 1,2
第三次查询列表 ['A','B','C'] 应该是 return 条记录 1,2,3
我需要一个 sql (postgres) 语句和 java 实现 javax.persistence.criteria.CriteriaBuilder
和 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)));
}
在 PostgreSQL 中,在带有包含运算符 <@
的 WHERE
子句中使用 string_to_array(mycolumn,',')
,例如
SELECT * FROM t
WHERE string_to_array(mycolumn,',') <@ ARRAY['A','B','C']
请记住,您必须创建一个与此条件相对应的索引,以防您处理大型 table,例如一个 GIN
索引。
CREATE INDEX idx_t_mycolumn_gin ON t USING gin (string_to_array(mycolumn,','));
演示:db<>fiddle
我有一个数据库 table 列,其中包含逗号分隔的字符串值,如下所示:
id mycolumn
-- --------
1 A
2 A, B
3 A, B, C
我无法更改它,因为它是旧的定制程序数据库。
我想根据字符串列表检查 mycolumn
:
第一次查询列表 ['A'] 应该是 return 记录 1
针对列表 ['A','B'] 的第二个查询应该是 return 条记录 1,2
第三次查询列表 ['A','B','C'] 应该是 return 条记录 1,2,3
我需要一个 sql (postgres) 语句和 java 实现 javax.persistence.criteria.CriteriaBuilder
和 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)));
}
在 PostgreSQL 中,在带有包含运算符 <@
的 WHERE
子句中使用 string_to_array(mycolumn,',')
,例如
SELECT * FROM t
WHERE string_to_array(mycolumn,',') <@ ARRAY['A','B','C']
请记住,您必须创建一个与此条件相对应的索引,以防您处理大型 table,例如一个 GIN
索引。
CREATE INDEX idx_t_mycolumn_gin ON t USING gin (string_to_array(mycolumn,','));
演示:db<>fiddle