Arrays QueryDSL数组重叠子查询函数

Arrays QueryDSL数组重叠子查询函数,arrays,postgresql,jpa,querydsl,Arrays,Postgresql,Jpa,Querydsl,有一个包含jsonb列的表,其中包含对象的数组,我设法设计了一个查询,查找至少匹配一个参数的任何元素的行: 选择uuid,来自产品p的数据 其中arrayoverlap(数组(选择jsonb_数组_元素(数据->'code')->'value'),数组['57060279','57627120']); 数据如下所示: {"name": "Peppermint", "codes": [{"type": "EAN-8", "value": "57627120"}, {"type": "EAN-8"

有一个包含jsonb列的表,其中包含对象的数组,我设法设计了一个查询,查找至少匹配一个参数的任何元素的行:

选择uuid,来自产品p的数据
其中arrayoverlap(数组(选择jsonb_数组_元素(数据->'code')->'value'),数组['57060279','57627120']);
数据如下所示:

{"name": "Peppermint", "codes": [{"type": "EAN-8", "value": "57627120"}, {"type": "EAN-8", "value": "57060279"}], "number": "000000000000002136"]}
{"name": "AnotherNameForPeppermint", "codes": [{"type": "EAN-8", "value": "57060279"}], "number": "000000000000009571"}
有没有一种方法可以使用QueryDSL运行这些程序? 到目前为止,我已经设法运行了一些基本函数,这些函数允许我匹配单个值,但对于数组,我无法找到如何匹配

import com.querydsl.core.types.Expression;
导入com.querydsl.core.types.dsl.booleanpression;
导入com.querydsl.core.types.dsl.CompariablePath;
导入com.querydsl.core.types.dsl.EntityPathBase;
导入com.querydsl.core.types.dsl.StringExpression;
导入静态com.querydsl.core.types.dsl.Expressions.booleanTemplate;
导入静态com.querydsl.core.types.dsl.Expressions.stringTemplate;
公共类QuerydslUtil{
公共静态布尔表达式jsonbContains(StringExpression haystack、Expression Pionel){
返回布尔模板(“函数('jsonb_包含',{0},{1})=true”,haystack,needle);
}
公共静态StringExpression jsonbExtractPath(对象数据,字符串属性名称){
返回getStringExpression(“jsonb_extract_path”、数据、propertyName);
}
公共静态StringExpression jsonbExtractPathText(对象数据,字符串属性名称){
返回getStringExpression(“jsonb_extract_path_text”,数据,propertyName);
}
公共静态StringExpression getStringExpression(字符串函数、对象数据、字符串属性名称){
返回stringTemplate(“函数(“+FUNCTION+”,{0},{1})”,数据,propertyName);
}
}
找到了一种方法: 新的助手方法:

public类QuerydslUtil{
公共静态布尔表达式JSONBEXISTANY(StringExpression数组属性,StringExpression数组){
返回booleanTemplate(“函数('jsonb_exists_any',{0},{1})=true”,arrayProperty,array);
}
公共静态布尔表达式JsonBexistAny(StringExpression arrayProperty,集合数组){
String String=array.stream().map(Object::toString.collect)(连接(“,”);
返回jsonbexistany(arrayProperty,stringToArray(string));
}
公共静态StringExpression stringToArray(字符串){
返回stringTemplate(“函数('string_to_数组',{0},{1})”,常量(string),常量(“,”);
}
}
然后:

StringExpression-codesPath=jsonbExtractPath($.data,“code”);
StringExpression codesValues=jsonbExtractPathText(codesPath,“值”);
//执行器是一个Spring数据查询器DslPredicateExecutor
//代码是一个集合
Iterable products=executor.findAll(jsonbExistsAny(codesvalue,code));