Я использую Blaze Persistence для сборки запроса.
Один из вариантов, который должен поддерживать построитель, — это проверка, содержит ли атрибут List заданное значение.
Таким образом, в псевдокоде это будет означать Entity.Attribute.contains(passedValue)
Сейчас мне сложно заставить этот запрос работать.
Я создал представление, содержащее следующее поле:
Код: Выделить всё
@Type(ListArrayType.class)
@Column(name = "co_creators", columnDefinition = "UUID[]")
private List coCreators;
Код: Выделить всё
COALESCE(
(SELECT ARRAY_AGG(cc.cocreatorid)
FROM cocreator cc
WHERE cc.elementid = c.id
AND cc.elementtype = 'COURSE'),
'{}'
) AS co_creators
1. где(значение).in(имяполя)
Код: Выделить всё
restrictionBuilder = criteria.where(queryParams.getValue().toString());
restrictionBuilder.in(queryParams.getFieldName());
Код: Выделить всё
com.blazebit.persistence.parser.expression.SyntaxErrorException: Could not parse expression '7035bf82-a831-4a78-8615-6cc0e0c1ca26', line 1:4 mismatched input 'bf82' expecting {, '+', '-', '*', '/', '%', '||'}
Код: Выделить всё
restrictionBuilder = criteria.where(":value");
restrictionBuilder.in(queryParams.getFieldName());
criteria.setParameter("value", queryParams.getValue().toString());
Код: Выделить всё
SELECT selectedObject FROM CourseView selectedObject WHERE :value IN (:param_0) ORDER BY selectedObject.uuid DESC
Код: Выделить всё
{7035bf82-a831-4a78-8615-6cc0e0c1ca26}
3. Используйте FUNCTION
Я тоже пробовал
Код: Выделить всё
restrictionBuilder = criteria.where("FUNCTION('any', :value, coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
4. Используйте FUNCTION без параметра
Затем я попробовал то же самое без setParameter, например:
Код: Выделить всё
restrictionBuilder =
criteria.where("FUNCTION('any', " + queryParams.getValue().toString() + ", coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
5. Экранирование значения
Также экранирование значения, например
Код: Выделить всё
restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
Код: Выделить всё
ExceptionHandlerExceptionResolver : Resolved [com.blazebit.persistence.impl.BuilderChainingException: A builder was not ended properly.]
Затем я попробовал это:
Код: Выделить всё
restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
restrictionBuilder.eq(true);
Код: Выделить всё
Caused by: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type boolean: "7035bf82-a831-4a78-8615-6cc0e0c1ca26"
Position: 562
Есть ли способ заставить это работать так, как мне нужно, с помощью Blaze Persistence?Я думаю, что можно было бы использовать собственный запрос, однако должна быть возможность использовать только собственный запрос для этого условия, но комбинировать его с другими (неродными) условиями.
Однако я не знаю, как включать пользовательские запросы/ условия в Blaze Persistence.
Подробнее здесь: https://stackoverflow.com/questions/793 ... ains-entry
Мобильная версия