【问题标题】:NHibernate - define where conditionNHibernate - 定义 where 条件
【发布时间】:2011-01-09 12:44:01
【问题描述】:

在我的应用程序中,用户可以定义搜索条件。他可以选择一列,设置一个运算符(等于、喜欢、大于、小于或等于等)并给出值。用户单击按钮后,应用程序应使用条件对数据库进行搜索。我使用 NHibernate,现在问我,使用 NHibernate 最有效的方法是什么。

我是否应该使用它创建一个查询,例如 (Column=Name, Operator=Like, Value=%John%)

        var a = session.CreateCriteria<Customer>();
        a.Add(Restrictions.Like("Name", "%John%"));
        return a.List<Customer>();

或者我应该使用 HQL 执行此操作:

        var q = session.CreateQuery("from Customer where " + where);
        return q.List<Customer >();

或者有没有更好的解决方案?

感谢您的帮助。

最好的问候,托马斯

【问题讨论】:

  • 如果您接受人们的回答,我相信有人会帮助您。
  • 嗨,菲尔 - 我只是没有看到,我必须标记一个已接受的答案。现在我已经为其他问题这样做了。我想,这会提高接受率吗? - 或者还有更多的事情要做吗?谢谢!

标签: nhibernate hql nhibernate.search nhibernate-criteria


【解决方案1】:

您可以使用其中任何一种。两者之间可能几乎没有区别。但是无论您做什么,都要确保您的列名是常量或映射到列名,否则您的存储库将与您的模型定义紧密耦合,即如果您更新列名,您将不得不自己去更新这些语句。

当您构建 where 子句时,确保您有一个附加正确查询的函数。你可能会有一个相同的 switch case 语句。

【讨论】:

    【解决方案2】:

    在效率方面没有区别。在 HQL 版本中,我更喜欢使用参数而不是将 where 部分添加为字符串。 如果您使用的是 NH3.0,您也可以考虑使用 QueryOver,以避免使用字符串来描述您的属性

    【讨论】:

    • 嗨 Felice - 你是什么意思这个“使用参数”?我可以为整个where定义一个参数吗?
    • 关于您的答案的另一个问题:您使用 NH3.0 吗? - 现在正式发布了吗?从 2.1 更新到 3.0 是否需要付出很大的努力?
    • 你可以写一个 hql 说 "where myprop=:p0" 然后调用 SetParameter("p0",myval)。这始终是一个好习惯。对于NH3.0的问题,是的,它是官方发布的,更新不是什么大问题,但如果我是你,我仍然会等待一些错误修复;)
    • 我建议您更新.. NH3 有一些变化。它不再支持 Session.Linq 了.. 相反,他们引入了 QueryOver,这非常棒.. 试试看..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多