Spring Data JPA: Specification

121
23 ноября 2019, 01:00

Мне нужно составить через спецификации запрос, в котором я исключу из выборки несколько 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"
Answer 1

Следите за скобками:

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).

READ ALSO
Android Error java.lang.NoClassDefFoundError при запуске

Android Error java.lang.NoClassDefFoundError при запуске

Использую библиотеку FrescoВыкидывает ошибку:

137
Не срабатывает PreUpdate в Spring Data

Не срабатывает PreUpdate в Spring Data

Есть вот такой класс:

117
JavaFX 11 javafx.embed.swing does not exist

JavaFX 11 javafx.embed.swing does not exist

Есть проект на OpenJDK11 + OpenJFX11Запускал через Maven, но необходимо перейти на Gradle

130