将条件查询附加到 Hibernate 中的先前查询

Append Criteria query to previous query in Hibernate

我有一个名为 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) 你用==而不是equals来比较字符串。所以你的代码总是进入最后一节 criteriaQuery.add(Restrictions.eq(column.get(i), value.get(i)));

2) 在您的 conjunction/disjunction 代码中,您仍然使用 Restrictions.or,这是错误的。您甚至不需要 Restrictions.or 或 Restrictions.and,因为连词无论如何都会用 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);

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