gpt4 book ai didi

java - 在java标准谓词中使用 native sql

转载 作者:太空宇宙 更新时间:2023-11-04 13:36:18 29 4
gpt4 key购买 nike

我有一个谓词(javax.persistence.criteria.Predicate),它按如下方式过滤原始数据:

    public Predicate byAccountsId(Collection<Long> accountsId) {
ParameterExpression<?> param = createParam(AOraArrayUserType.class, new AOraArrayUserType(accountsId));
return criteriaBuilder().or(
criteriaBuilder()
.equal(criteriaBuilder().function("in_ex", Long.class, actSourceJoin().get(Account_.id),
param), 1),
criteriaBuilder().equal(
criteriaBuilder().function("in_ex", Long.class, actDestinationJoin().get(Account_.id),
param), 1));
}

该谓词构建查询的下一部分:

..
where
..
act.source_id in (accountsId.values())
or act.destination_id in (accountsId.values() - array ids)
..

它工作正常,但原始数据可能太多。我想使用“Oracle功能索引”,它从查询结果中删除不必要的数据。我尝试按如下方式重写我的谓词:

    public Predicate byAccountsId(Collection<Long> accountsId) {
ParameterExpression<?> param = createParam(AOraArrayUserType.class, new AOraArrayUserType(accountsId));
return criteriaBuilder().or(
criteriaBuilder().literal(
Restrictions.sqlRestriction("case when state != 'ARCHIVE' then source_id else null end"))
.in(param));
}

结果查询构建良好,但没有返回结果。但是当我将结果查询复制到 SQL Developer 并运行查询时,它会返回预期结果。

由新谓词构建的查询的一部分:

..
where
..
(case when act.state != 'ARCHIVE' then act.source_id else null end) in (accountsId.values() - array ids)
..

有人知道为什么我在使用新谓词时没有得到正确的结果吗?我可以将 hibernate.criterion.Restrictionsjavax.persistence.criteria.Predicate 一起使用吗?

最佳答案

您可以为实体 (AOraArrayUserType) 中的表达式定义 @Formula 并在条件中使用该字段

Restrictions.in("theFormulaField", param)

关于java - 在java标准谓词中使用 native sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31667680/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com