2010-07-30 75 views
1

的休眠手册这样说:NHibernate的CreateSqlQuery和addEntity

字符串SQL = “SELECT ID为{c.id},NAME为{c.name},” +

"BIRTHDATE as {c.birthDate}, MOTHER_ID as {c.mother}, {mother.*} " + 

    "FROM CAT_LOG c, CAT_LOG m WHERE {c.mother} = c.ID"; 

列表loggedCats = sess.createSQLQuery(SQL)

.addEntity("cat", Cat.class) 

    .addEntity("mother", Cat.class).list() 

现在,我有什么是基本相同的。我是每行返回两个相同类型的。我做一个选择是这样的:

SELECT {ctrl1.*}, {ctrl2.*} FROM tableA AS A 
               LEFT JOIN tableB AS ctrl1 ON (A.controlID = ctrl1.controlID AND ctrl1.controlOptionType = ? AND ctrl1.controlOptionValue = ?) 
               LEFT JOIN tableB AS ctrl2 ON (A.controlID = ctrl2.controlID AND ctrl2.controlOptionType = ? AND ctrl2.controlOptionValue = ?) 

然后我addEntity("ctrl1", typeof(mycontrolclass)addEntity("ctrl1", typeof(mycontrolclass)

这似乎完全一样,以我为榜样。但我得到这个异常: “无法执行查询”,内部异常是“无法在结果中找到指定的列”。 如果我复制异常中的sql(它已添加“AS ctrl1_1_3_3_”等)它工作正常。

谢谢。

回答

0

你究竟想要做什么?我相信你可能不需要使用它们中的任何一个。

// Using HQL: 
var motherId = 25; 
var hql = "select c.birthDate, c.mother from Cat c where c.mother.Id = :motherId"; 
var result = Session.CreateQuery(hql) 
        .SetParameter("motherId", motherId) 
        .ToList(); 

// Using NHibernate.LINQ: 
var result = (from cat in Session.Linq<Cat>() 
      where cat.Mother.Id == motherId 
      select new { cat.birthDate, cat.mother }).ToList(); 
+0

那么,不管查询是如何组成的,它仍然返回一个对象数组。如果我有一个连接两次连接同一个表的连接,它只是重复该表而不是为该行提供第二个实例。 – Matt 2010-07-30 09:03:06

+0

你能解释一下吗?我不太理解。 – rebelliard 2010-07-30 12:36:27

+0

好吧,让我说,我这样做,它会返回两个tableB结果在每一行。所以说.List将返回一个数组,如: pos 0:[tableB] [tableB] pos 1:[tableB] [tableB] 但是第一个(在每一行中)tableB结果(id和这样)应该不同于第二张表B的结果。但不是。它只是重复 – Matt 2010-07-30 21:50:12

0

我处理你的问题,只是为了学习目的,因为你一定会 发现在同时,一个解决方案,但这个问题不应该在 躺在查询(这是确定),但在某些映射不一致或其他地方 (也许数据库)。

相关问题