【发布时间】:2013-12-26 09:22:09
【问题描述】:
如果我使用 Nhibernate HQL 而不是 queryovers 和 joins 会很糟糕吗?
我正在尝试从数据库中查询大量数据,并且由于要求的复杂性,很难构建查询。一个是我应该分别投影属于单个列的两个或多个字段(我不知道要这样做,我只是 nhibernate 中的菜鸟)
我现在正在考虑通过 HQL 来完成。可以吗? :(
【问题讨论】:
标签: nhibernate
如果我使用 Nhibernate HQL 而不是 queryovers 和 joins 会很糟糕吗?
我正在尝试从数据库中查询大量数据,并且由于要求的复杂性,很难构建查询。一个是我应该分别投影属于单个列的两个或多个字段(我不知道要这样做,我只是 nhibernate 中的菜鸟)
我现在正在考虑通过 HQL 来完成。可以吗? :(
【问题讨论】:
标签: nhibernate
我想根据我的经验附上我的答案:更喜欢 Criteria 或 QueryOver API 而不是 HQL。
这篇文章是论证的起点:http://ayende.com/blog/4042/nhibernate-queries-should-i-use-hql-or-criteria。一小段摘录,引用:
... HQL 是 NHibernate 发挥其大部分功能的方式...它与 SQL 的相似性意味着它通常在编写和阅读它时非常直观
然而,它最大的弱点是当您想要使用一些动态条件执行查询时。例如,如果您想要一个包含多个可选搜索字段的搜索页面。 对于这种情况,我们有 Criteria API,它允许我们动态、轻松、轻松地编写查询。 ...
我想在第二段签字!迟早,您会将您的应用程序(服务器部分/数据层)移动到某个点,在那里您将做一些一般的事情。常见的分页、排序、过滤……
要创建有效的 HQL 将需要越来越多的努力,因为您将自己完成几乎所有工作。
使用Criteria/QueryOver API,您只需调用标准方法Join、Where、OrderBy....
不要担心如何将所有部分放在一起(例如 WHERE x AND y ... " AND " 运算符的注入)。
所以,知道 HQL,但学习 Criteria resp QueryOver API... 并使用 THEM
编辑:标准世界中的预测很有趣。
更重要的是,它们可以封装成对象、自定义投影或自定义投影包。因此我们可以获得可重用的代码,这可以隐藏一些实现的复杂性。但是因为它们是对象,所以我们可以测试它们并在以后依赖它们
而且我们还可以实现自定义的 Transformer,这会带来更多的好处。见example here
一些投影示例:
【讨论】:
StringBuilder 成为了我的朋友,对查询的任何更新都成了一场噩梦。标准的 API 已准备好做同样的事情。它不像 HQL 那样直截了当(看起来与 SQL 非常相似)。但过一段时间就会改变。您可以使用封装部分的对象(投影、排序、过滤、子选择)。总结:尽管 HQL 的外观和感觉很性感,但请至少尝试其他的......
HQL 的缺点是它不是类型安全的。就像您在 C# 代码中编写 TSQL 一样。它只是产生臭代码。 如果你的领域模型发生了一些变化,你很有可能会因为不同步的代码而遇到奇怪的异常......
但如果这不是你担心的事情,我会说,这取决于你;)
【讨论】: