Имея таблицу со столбцом jsonb , которая содержит, среди прочего, массив из объектов , мне удалось разработать запрос, который находит строки с любыми элементами, которые соответствуют хотя бы одному аргументу:
SELECT uuid, data FROM product p
WHERE arrayoverlap(array(SELECT jsonb_array_elements(data->'codes')->>'value'), array['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? Мне уже удалось запустить некоторые базовые c функции, которые позволяют мне сопоставлять отдельные значения, но для массивов я не могу понять, как.
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.ComparablePath;
import com.querydsl.core.types.dsl.EntityPathBase;
import com.querydsl.core.types.dsl.StringExpression;
import static com.querydsl.core.types.dsl.Expressions.booleanTemplate;
import static com.querydsl.core.types.dsl.Expressions.stringTemplate;
public class QuerydslUtil {
public static BooleanExpression jsonbContains(StringExpression haystack, Expression<String> needle) {
return booleanTemplate("FUNCTION('jsonb_contains', {0}, {1}) = true", haystack, needle);
}
public static StringExpression jsonbExtractPath(Object data, String propertyName) {
return getStringExpression("jsonb_extract_path", data, propertyName);
}
public static StringExpression jsonbExtractPathText(Object data, String propertyName) {
return getStringExpression("jsonb_extract_path_text", data, propertyName);
}
public static StringExpression getStringExpression(String function, Object data, String propertyName) {
return stringTemplate("FUNCTION('" + function + "', {0}, {1})", data, propertyName);
}
}