【问题标题】:NHibernate CreateSQLQuery return list of objects with populated properties (i.e. eager loading)NHibernate CreateSQLQuery 返回具有填充属性的对象列表(即急切加载)
【发布时间】:2013-05-10 14:41:56
【问题描述】:

我在 c# 应用程序中使用 Nhibernate。

我正在使用“CreateSQLQuery”从数据库中加载对象列表。 问题是我还希望同时填充该对象的属性之一。

例如 给定对象: 公司 员工

我有一个如下所示的 SQL 查询:

SELECT DISTINCT {e.*}, {c.*}
FROM Employee e
INNER JOIN Company c on e.company = c.id

(实际查询要复杂得多,这就是为什么我不能只使用条件 API 或 linq。)

我的代码是这样的:

ISQLQuery sql = session.CreateSQLQuery(sqlText);
sql.AddEntity(e", typeof(Employee));
sql.AddJoin("c",  "e.Company");
sql.SetResultTransformer(new DistinctRootEntityResultTransformer());
dbEmlpoyees = sql.List<Employee>().ToList();

但是,这似乎返回了一个扁平列表(即返回了 Employee 和 Company 对象)。 我只希望返回 Exployee 对象,但我希望填充 Employee 的 Company 属性。这可以在一个数据库调用中实现吗?

(我可以只获取员工列表,然后在会话仍然打开时为每条记录填充公司属性,但这似乎效率很低)

【问题讨论】:

  • 你从sql.List&lt;Employee&gt;()的代码中得到一个错误?
  • 是的,因为结果集中的一些元素是公司对象。
  • 但是 Employee.Company 属性设置为公司?
  • 简短的回答是;以这种方式使用转换器和 createSQLQuery 时,您不能急于加载集合。现在我从未在 NH 上尝试过这个,但请看这里,docs.jboss.org/hibernate/orm/3.3/reference/en/html/… esp。在底部的几个查询中。
  • 谢谢,我去看看

标签: c# nhibernate


【解决方案1】:

您可以在一次往返中单独查询两个表,并让会话将它们组合起来

session.Query<Company>().Where(...).ToFuture();
var results = session.Query<Employee>().Where(...).ToFuture();

return results.ToList();

【讨论】:

  • 感谢您的信息。虽然我知道未来的查询,但我没有想过为此使用它们。不幸的是,正如问题所述,我不能使用 linq 查询或 cirteria api。该解决方案需要使用 CreateSQLQuery
  • 只适应SqlQuery并尝试一下。
猜你喜欢
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多