Мне нужно составить через спецификации запрос, в котором я исключу из выборки несколько ID.
Сделал я это так:
case "not_in":
ArrayList<Integer> list = Lists.newArrayList(
Arrays
.stream(filter.getValue().toString().split("\\s*,\\s*"))
.map(Integer::parseInt)
.collect(Collectors.toList())
);
predicate = criteriaBuilder.not(root.get(filter.getField())).in(list);
break;
По итогам составления спецификации, я ожидаю увидеть запрос, похожий на такой:
select generatedAlias0
from ru.gamble.main.domain.AuthLog as generatedAlias0
where generatedAlias0.userId not in (11523666)
order by generatedAlias0.dateTime desc
Формируется следующий запрос:
select generatedAlias0
from ru.gamble.main.domain.AuthLog as generatedAlias0
where generatedAlias0.userId <> true in (11523666)
order by generatedAlias0.dateTime desc
В принципе, запрос рабочий, и если его выполнить в консоли как скрипт, он исполнится нормально. Но в случае с Hibernate, выдаёт следующее:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException:
unexpected AST node:
in near line 1, column 115
[select generatedAlias0 from ru.main.domain.AuthLog as generatedAlias0
where generatedAlias0.userId <> true in (11523666)
order by generatedAlias0.dateTime desc]
Есть идеи, как это решить?
HIBERNATE_VERSION = "4.3.10.Final"
SPRING_DATA_VERSION = "1.11.10.RELEASE"
Следите за скобками:
criteriaBuilder.not(root.get(filter.getField())).in(list); // Ваш вариант
criteriaBuilder.not(root.get(filter.getField()).in(list)); // Правильный вариант
В вашем варианте отрицание применяется только к операнду root.get(filter.getField())
, а надо применять его ко всему выражению root.get(filter.getField()).in(list)
.
Использую библиотеку FrescoВыкидывает ошибку:
Есть проект на OpenJDK11 + OpenJFX11Запускал через Maven, но необходимо перейти на Gradle