使用NHibernate进行查询

3

我是NHibernate的新手,所以这是一个基础问题。

在通过NHibernate会话从数据库获取数据时,我到目前为止只使用了Id,例如:

var customer = Session.Get<Customer>(customerId); 

但是如果我想通过不是Id的属性来获取对象,该怎么做呢?例如根据“Name”属性搜索客户。这可能会返回0-n个答案,所以我认为我会得到一个列表?

4个回答

4
另一个选择是Linq2NHibernate,它最近变得越来越成熟
使用方法如下=>
var employees = Session.Linq<Employee>()
    .Single(employee=>employee.Name==name);

Linq扩展方法返回INHibernateQueryable接口,该接口实现了IQueryable。

我认为我会等到 NH3 版本再考虑这个。它还在不断发展中。 - Jim Mitchener
好的 - 这看起来非常有趣!目前我正在遭受过多需要学习的新框架和技术的压力,所以我现在不能再接受另一个。但是谢谢;我已经记下了Linq2NHibernate,并且以后一定会仔细研究! - stiank81
另一个 Linq 提供程序是 NHibernate.Linq。它比 3.0 提供程序更有限,但其有限的功能非常稳定。 - Paco
实际上- 我已经在真实项目中使用过这个。效果非常不错。而且linq2nhibernate与hql/icriteria并不是互斥的。 - Arnis Lapsa

2
使用HQL,代码可能如下所示:
session.CreateQuery("from Customer where Name=:name")
       .SetString("name", name)
       .List<Customer>();

谢谢!运行得非常完美,HQL看起来很不错 - 是吗? - stiank81

2

这里基本上有两种选择:HQLCriteria API。Hibernate 的文档非常好,所以我强烈建议您阅读它,而不是让我发表一个过于冗长的答案。


谢谢!Criteria API 看起来也很有趣。我会更仔细地研究它。 - stiank81
更甚者,我更喜欢使用Criteria API而非HQL。 :) - Frederik Gheysels

2

查询 NHibernate 的方式有很多:

  • HQL
  • Criteria
  • Query by example
  • Query over criteria
  • LINQ(提供了两种不同的 LINQ 提供程序)
  • H-SQL
  • SQL
  • 您可以实现自己的查询方式

感谢您提供这么丰富的列表!您个人有什么偏好吗? - stiank81
根据查询的复杂程度,我使用以下方法:1. beta linq,2. 旧版 linq,3. hql,4. hsql,5. sql。过去我曾经使用过 criteria,但是它容易出错,与 linq 相比不如。只要为查询编写测试并对异常情况使用其他查询方法,beta linq 就可以使用。 - Paco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接