在 java 条件谓词中使用本机 sql
Using native sql in java criteria predicate
我有一个谓词(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)
..
它工作正常,但可能有太多原始 data.I 想要使用 "Oracle functional index",这会从查询结果中删除不必要的数据。我尝试重写我的谓词如下:
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));
}
Resurlt 查询构建正常,但 returns 没有结果。但是当我将结果查询复制到 sql 开发人员并且 运行 查询它 returns 预期结果时。
由新谓词构建的部分查询:
..
where
..
(case when act.state != 'ARCHIVE' then act.source_id else null end) in (accountsId.values() - array ids)
..
有人知道为什么我在使用新谓词时得不到正确的结果吗?
我可以将 hibernate.criterion.Restrictions
与 javax.persistence.criteria.Predicate
一起使用吗?
您可以在实体 (AOraArrayUserType) 中为表达式定义 @Formula
并使用条件中的字段
Restrictions.in("theFormulaField", param)
我有一个谓词(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)
..
它工作正常,但可能有太多原始 data.I 想要使用 "Oracle functional index",这会从查询结果中删除不必要的数据。我尝试重写我的谓词如下:
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));
}
Resurlt 查询构建正常,但 returns 没有结果。但是当我将结果查询复制到 sql 开发人员并且 运行 查询它 returns 预期结果时。
由新谓词构建的部分查询:
..
where
..
(case when act.state != 'ARCHIVE' then act.source_id else null end) in (accountsId.values() - array ids)
..
有人知道为什么我在使用新谓词时得不到正确的结果吗?
我可以将 hibernate.criterion.Restrictions
与 javax.persistence.criteria.Predicate
一起使用吗?
您可以在实体 (AOraArrayUserType) 中为表达式定义 @Formula
并使用条件中的字段
Restrictions.in("theFormulaField", param)