【问题标题】:Append Criteria query to previous query in Hibernate将条件查询附加到 Hibernate 中的先前查询
【发布时间】:2018-09-19 17:43:19
【问题描述】:

我有一个名为 andOrButtonFilter 的字符串数组,它存储用户选择的 and or 过滤器。

还有两个名为columnvalueArrayList 分别存储列名及其值。

我希望当前查询附加到上一个查询并显示结果 但是我的查询没有附加到上一个查询中,它显示的是单独的结果。

例如: 如果name=xyz 是第一个查询并且 age=26 是第二个查询
name=xyzage=26 不会产生结果。仅在第二次执行时显示age=26 的结果。

我哪里错了?

这是我目前正在使用的代码:

for (int i=0; i<andOrButtonFilter.length; i++)
    {

        if(andOrButtonFilter[i]=="and")
        {
            Conjunction conjunction =Restrictions.conjunction();
            if ((column.get(i) != null) && (value.get(i)!=null))
            {
                conjunction.add(Restrictions.or(Restrictions.eq(column.get(i), value.get(i))));
                criteriaQuery.add(conjunction);
            }
        }

        else if(andOrButtonFilter[i]=="or")
        {
            Disjunction disjunction =Restrictions.disjunction();
            if ((column.get(i) != null) && (value.get(i)!=null))
            {
                disjunction.add(Restrictions.or(Restrictions.eq(column.get(i), value.get(i))));
                criteriaQuery.add(disjunction);
            }
        }

        else 
        {

            criteriaQuery.add(Restrictions.eq(column.get(i), value.get(i)));
        }
    }

【问题讨论】:

    标签: java hibernate criteria hibernate-criteria restrictions


    【解决方案1】:

    我可以发现您的代码存在一些问题。

    1) 你用 == 而不是 equals 比较字符串。所以你的代码总是进入最后一部分criteriaQuery.add(Restrictions.eq(column.get(i), value.get(i)));

    2) 在您的合取/析取代码中,您仍然使用 Restrictions.or,这是一种错误。您甚至不需要 Restrictions.or 或 Restrictions.and 因为 Conjunction 无论如何都添加了 AND 限制,而 Disjunction 无论如何都添加了 OR。

    3) 在每次迭代中,您添加单独的析取,这基本上是一个单一的标准,不会像您期望的那样工作。

    我会尝试类似的东西:

     Disjunction disjunction =Restrictions.disjunction();
     Conjunction conjunction =Restrictions.conjunction(); 
     for (int i=0; i<andOrButtonFilter.length; i++)
        {
            if("and".equals(andOrButtonFilter[i]))
            {         
                if ((column.get(i) != null) && (value.get(i)!=null))
                {
                    conjunction.add(Restrictions.eq(column.get(i), value.get(i)));             
                }
            }
            else if("or".equals(andOrButtonFilter[i]))
            {           
                if ((column.get(i) != null) && (value.get(i)!=null))
                {
                    disjunction.add(Restrictions.eq(column.get(i), value.get(i)));              
                }
            }
            else 
            {
                criteriaQuery.add(Restrictions.eq(column.get(i), value.get(i)));
            }
        }
        criteriaQuery.add(conjunction);
        criteriaQuery.add(disjunction);
    

    我并不是说确切的代码会起作用,因为我还没有测试过它;)但是你明白了,你可以从那里调试。

    【讨论】:

    • 我尝试了您的代码,现在正在根据各自的and or 过滤器访问`ifelse 块,但仍然没有将查询附加到上一个查询,只有最后一个值是询问。你能说出原因是什么吗?
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2015-01-11
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多