NHibernate,使用HQL代替queryovers

NHibernate,使用HQL代替queryovers,nhibernate,Nhibernate,如果我使用Nhibernate HQL而不是queryovers和Join,这不好吗 我试图从数据库中查询大量数据,由于需求的复杂性,很难构建查询器。一个是我应该分别投影属于单个列的两个或多个字段(我不知道怎么做,我只是nhibernate的一个noob) 我现在想用HQL来做。可以吗(HQL的缺点是它不是类型安全的。就好像你在用C#代码编写TSQL一样。它只会产生难闻的代码。 如果您的域模型发生了变化,您很可能会因为代码不同步而遇到奇怪的异常 但如果这不是你担心的事情,那就由你决定了;)根据我

如果我使用Nhibernate HQL而不是queryovers和Join,这不好吗

我试图从数据库中查询大量数据,由于需求的复杂性,很难构建查询器。一个是我应该分别投影属于单个列的两个或多个字段(我不知道怎么做,我只是nhibernate的一个noob)


我现在想用HQL来做。可以吗(

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


但如果这不是你担心的事情,那就由你决定了;)

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

这是本文论证的出发点:。小摘录,引用:

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

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

我想签下第二段!迟早,您会将应用程序(服务器部件/数据层)移动到某个位置,在那里您将做一些常规工作。常见的分页、排序、筛选

HQL上的标准响应查询 创建有效的HQL将需要越来越多的努力,因为几乎所有的工作都是由您自己完成的

使用
标准
/
查询版本
API,您只需调用标准方法
Join
Where
OrderBy
。。。。 不必担心如何将所有部件放在一起(例如,x和y…AND运算符的注入)

所以,你知道HQL,但学习标准和查询API。。。并使用它们

编辑:标准世界中的投影很有趣

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

我们还可以实现定制变压器,这将带来更多的好处。看

预测的一些例子:


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