将条件查询附加到 Hibernate 中的先前查询
Append Criteria query to previous query in Hibernate
我有一个名为 andOrButtonFilter
的字符串数组,它存储用户选择的 and
or
个过滤器。
还有两个 ArrayList
分别命名为 column
和 value
存储列名及其值。
我希望当前查询附加到上一个查询并显示结果
但是我的查询没有附加到以前的查询,它显示的是单独的结果。
例如:
如果 name=xyz
是第一个查询并且
age=26
是第二个查询
name=xyz
和 age=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);
我并不是说确切的代码可以工作,因为我还没有测试过它 ;) 但你明白了,你可以从那里进行调试。
我有一个名为 andOrButtonFilter
的字符串数组,它存储用户选择的 and
or
个过滤器。
还有两个 ArrayList
分别命名为 column
和 value
存储列名及其值。
我希望当前查询附加到上一个查询并显示结果 但是我的查询没有附加到以前的查询,它显示的是单独的结果。
例如:
如果 name=xyz
是第一个查询并且
age=26
是第二个查询
name=xyz
和 age=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);
我并不是说确切的代码可以工作,因为我还没有测试过它 ;) 但你明白了,你可以从那里进行调试。