Контрольный список устойчивости Blaze содержит записьJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Контрольный список устойчивости Blaze содержит запись

Сообщение Anonymous »

В настоящее время я пытаюсь реализовать универсальный построитель запросов, который можно повторно использовать для разных объектов.
Я использую 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 {, '+', '-', '*', '/', '%', '||'}
2. Установить значение в качестве параметра

Код: Выделить всё

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
Однако это кажется правильным, если у меня есть объект с полем coCreators, например:

Код: Выделить всё

{7035bf82-a831-4a78-8615-6cc0e0c1ca26}
И передайте '7035bf82-a831-4a78-8615-6cc0e0c1ca26' в качестве моего значения, он вернет пустой список, но я ожидаю, что указанная выше запись будет найдена.
3. Используйте FUNCTION
Я тоже пробовал

Код: Выделить всё

restrictionBuilder = criteria.where("FUNCTION('any', :value, coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
однако это приводит к разрешению [java.lang.IllegalArgumentException: имя параметра «значение» не существует]
4. Используйте FUNCTION без параметра
Затем я попробовал то же самое без setParameter, например:

Код: Выделить всё

restrictionBuilder =
criteria.where("FUNCTION('any', " + queryParams.getValue().toString() + ", coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
Это приведет к тому же исключению SyntaxErrorException, что и мой первый вариант
5. Экранирование значения
Также экранирование значения, например

Код: Выделить всё

restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
не помогает. Это приведет к тому, что

Код: Выделить всё

ExceptionHandlerExceptionResolver : Resolved [com.blazebit.persistence.impl.BuilderChainingException: A builder was not ended properly.]
6. Экранируйте значение с помощью eq(true)
Затем я попробовал это:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»