【问题标题】:Using native sql in java criteria predicate在 java 条件谓词中使用本机 sql
【发布时间】:2015-10-18 11:59:36
【问题描述】:

我有一个谓词(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));
    }

Resurlt 查询构建良好,但不返回任何结果。但是当我将结果查询复制到 sql developer 并运行查询时,它会返回预期的结果。

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

..
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 一起使用吗?

【问题讨论】:

    标签: java sql oracle hibernate criteria


    【解决方案1】:

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

    Restrictions.in("theFormulaField", param)
    

    【讨论】:

    • 谢谢。结果代码如下:@Formula("CASE WHEN state = 'ARCHIVE' THEN 1 ELSE 0 END") private boolean archived; 并使用此公式:criteriaBuilder().equal(root().get(Act_.archived), false);
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多