带OR的nHibernate动态查询

时间:2012-07-24 09:37:16

标签: java nhibernate dynamic hibernate-criteria

我们有一个表单,允许用户指定查询数据库的条件。

我们的表单构建“标准”对象,然后用于构建nHibernate标准。

我们目前的代码是:

public virtual ICriteria BuildCriteria(ICriteria criteria)
{
    foreach (SheCriterion criterion in this.SheCriterions)
    {
        if (criterion.OperatorKey == "OR")
        {
            //// code required here to process ORs
        }
        criteria.Add(criterion.BuildCriterion());
    }
    return criteria;
}

不幸的是,这就是我被困住的地方 - 如果我们和每个标准都没有问题但我在解决如何添加OR方面遇到困难 - 当我们知道涉及OR时,先前的标准已经处理完毕。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

or并不容易。考虑a and b or c有两种不同的可能性(a and b) or ca and (b or c),因此如果a = false您将得到两个不同的答案。你必须在

中建立一个标准树
public virtual ICriteria BuildCriteria(ICriteria criteria)
{
    foreach (SheCriterion criterion in this.SheCriterions)
    {
        criteria.Add(criterion.BuildCriterion());
    }

    return criteria;
}

public virtual ICriterion BuildCriterion()
{
    if (OperatorKey == "OR")
    {
        return new Disjunction()
            .Add(Left.BuildCriterion())
            .Add(right.BuildCriterion());
    }
    else
    {
        return new Conjunction()
            .Add(Left.BuildCriterion())
            .Add(right.BuildCriterion());
    }
}

更新:否则你需要一棵树

Man { Name = "Bill", Eyecolor = "blue", Height = 175, IsRich = true };

// will show Bill
SELECT * FROM Men WHERE height > 180 AND eyecolor = blue OR IsRich = 1
SELECT * FROM Men WHERE (height > 180 AND eyecolor = blue) OR IsRich = 1

// will not show Bill
SELECT * FROM Men WHERE height > 180 AND (eyecolor = blue OR IsRich = 1)