【问题标题】:NHibernate, use HQL instead of queryoversNHibernate,使用 HQL 而不是查询
【发布时间】:2013-12-26 09:22:09
【问题描述】:

如果我使用 Nhibernate HQL 而不是 queryovers 和 joins 会很糟糕吗?

我正在尝试从数据库中查询大量数据,并且由于要求的复杂性,很难构建查询。一个是我应该分别投影属于单个列的两个或多个字段(我不知道要这样做,我只是 nhibernate 中的菜鸟)

我现在正在考虑通过 HQL 来完成。可以吗? :(

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    我想根据我的经验附上我的答案:更喜欢 CriteriaQueryOver API 而不是 HQL

    这篇文章是论证的起点:http://ayende.com/blog/4042/nhibernate-queries-should-i-use-hql-or-criteria。一小段摘录,引用:

    ... HQL 是 NHibernate 发挥其大部分功能的方式...它与 SQL 的相似性意味着它通常在编写和阅读它时非常直观

    然而,它最大的弱点是当您想要使用一些动态条件执行查询时。例如,如果您想要一个包含多个可选搜索字段的搜索页面。 对于这种情况,我们有 Criteria API,它允许我们动态、轻松、轻松地编写查询。 ...

    我想在第二段签字!迟早,您会将您的应用程序(服务器部分/数据层)移动到某个点,在那里您将做一些一般的事情。常见的分页、排序、过滤……

    Criteria resp QueryOver over HQL

    要创建有效的 HQL 将需要越来越多的努力,因为您将自己完成几乎所有工作。

    使用Criteria/QueryOver API,您只需调用标准方法JoinWhereOrderBy.... 不要担心如何将所有部分放在一起(例如 WHERE x AND y ... " AND " 运算符的注入)

    所以,知道 HQL,但学习 Criteria resp QueryOver API... 并使用 THEM

    编辑:标准世界中的预测很有趣。

    更重要的是,它们可以封装成对象、自定义投影或自定义投影包。因此我们可以获得可重用的代码,这可以隐藏一些实现的复杂性。但是因为它们是对象,所以我们可以测试它们并在以后依赖它们

    而且我们还可以实现自定义的 Transformer,这会带来更多的好处。见example here

    一些投影示例:

    https://stackoverflow.com/a/18885527/1679310

    【讨论】:

    • 没有人提到投影...投影让我想使用 hql 而不是查询...当然您不想获取所有列,这就是您使用投影的原因,但是如果需要列怎么办太复杂了(就像我上面的场景)是标准/查询仍然是一个不错的选择,我认为他们只擅长组成查询的过滤器,而不是在查询结果中选择你想要的列
    • 我已经更新了我的答案。这里的重点是,我试图阻止您使用 HQL。我走这条路。认为它/很酷。但不久之后,我迷失在自己的字符串解析 QL 中。 StringBuilder 成为了我的朋友,对查询的任何更新都成了一场噩梦。标准的 API 已准备好做同样的事情。它不像 HQL 那样直截了当(看起来与 SQL 非常相似)。但过一段时间就会改变。您可以使用封装部分的对象(投影、排序、过滤、子选择)。总结:尽管 HQL 的外观和感觉很性感,但请至少尝试其他的......
    【解决方案2】:

    HQL 的缺点是它不是类型安全的。就像您在 C# 代码中编写 TSQL 一样。它只是产生臭代码。 如果你的领域模型发生了一些变化,你很有可能会因为不同步的代码而遇到奇怪的异常......

    但如果这不是你担心的事情,我会说,这取决于你;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多