我需要通过规范提出请求,其中我将从选择中排除几个 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"
注意括号:
在您的版本中,否定仅适用于操作数
root.get(filter.getField())
,但您需要将其应用于整个表达式root.get(filter.getField()).in(list)
。