将标准查询附加到Hibernate中的先前查询

时间:2018-04-10 07:37:39

标签: java hibernate criteria hibernate-criteria restrictions

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

另外两个ArrayList名为columnvalue分别存储列名及其值。

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

例如: 如果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)));
        }
    }

1 个答案:

答案 0 :(得分:0)

我可以找到一些代码问题。

1)您将字符串与==而不是等于进行比较。因此,您的代码始终会进入最后一部分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);

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