【问题标题】:Hibernate restrictions (And / Or)Hibernate 限制(与/或)
【发布时间】:2010-06-21 14:15:16
【问题描述】:

关于限制的小问题。

我有这样的查询:

Where  A in(1,6) and (B not like 'Value%' or B not like 'ValueII%')

问题是字段B不包含固定值,可以是一个或多个。

请 (N)Hibernate 专家 - 帮我解决这个问题,我找不到可行的解决方案。非常感谢任何帮助!

【问题讨论】:

  • “字段不包含固定值”是什么意思?

标签: c# nhibernate criteria


【解决方案1】:

您可以使用析取来处理 OR 情况,例如:

IList results = session.CreateCriteria(typeof(MyType))
    .Add(Restrictions.In("A", new [] {1, 6}))
    .Add(Restrictions.Disjunction()
        .Add.Restrictions.Not(Restrictions.Like("B", "Value%"))
        .Add.Restrictions.Not(Restrictions.Like("B", "ValueII%")))
    .List<MyType>();

如果您需要在 for 循环中处理析取条件(根据您的后续操作),您可以使用如下代码:

ICriteria query = session.CreateCriteria(typeof(MyType));
query.Add(Restrictions.In("A", new [] {1, 6}))

Disjunction disjunction = Restrictions.Disjunction();
foreach (var value in values) {
    disjunction.Add(Restrictions.Not(Restrictions.Like(value, "Value%")));
    disjunction.Add(Restrictions.Not(Restrictions.Like(value, "ValueII%")));
}
query.Add(disjunction);

IList results = query.List<MyType>();

话虽如此,我认为您的逻辑可能存在缺陷。如果您正在测试这些值以“不匹配一个模式或不匹配另一个模式”,那么条件将始终评估为真(除非模式相同)。您确定要在此处使用 OR 吗?

【讨论】:

    【解决方案2】:

    问题是我不知道我有多少限制,我需要在析取中使用 FOR。

    类似的东西:

    IList results = session.CreateCriteria(typeof(MyType))
    .Add(Restrictions.In("A", new [] {1, 6}))
    .Add(Restrictions.Disjunction());
     for(int i = 0, i < value.Lenght;i++){
        .Add.Restrictions.Not(Restrictions.Like("B", "Value%"));
        .Add.Restrictions.Not(Restrictions.Like("B", "ValueII%"));
     }
    .List<MyType>();
    

    感谢您的帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2019-09-04
      • 2021-09-12
      • 2018-02-28
      相关资源
      最近更新 更多