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

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

Сообщение Anonymous »

В настоящее время я пытаюсь реализовать универсальный построитель запросов, который можно повторно использовать для разных объектов. Я использую Blaze Persistence для сборки запроса. Одна из опций, которую должен поддерживать построитель, — это проверка, содержит ли атрибут списка заданное значение. Таким образом, в псевдокоде это будет означать 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
Затем я пытаюсь собрать запрос следующими способами, однако ничего не работает должным образом:
  • where(value) .in(fieldName)

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

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

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

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

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

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

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

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

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

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

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

ExceptionHandlerExceptionResolver : Resolved [com.blazebit.persistence.impl.BuilderChainingException: A builder was not ended properly.]
  • Экранирование значения с помощью 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»