NHibernate 左外连接不相关实体

2023-12-23

我有 2 个实体角色和翻译。
角色 -> Role_ID、代码
翻译 -> 代码、语言、名称

这个想法是说对于某个角色,它有英文名、法文名等等。
例如:
Role(1, 'Rol_001') 可以具有以下关系:Translation('Rol_001', 'English', '') & Translation('Rol_001', 'French', '')。

我想用HQL表达以下SQL查询:


select r.Role_ID, t.Name
from Role r left outer join Translation t 
   on r.Code = t.Code and t.Language = @lang;

在我的映射文件中,这两个实体之间没有任何关系,但以下 HQL 查询的工作方式就好像它是内部联接一样


IQuery query = session.CreateQuery("select new Lookup(r.Role, t.Name) from Role r, Translation t where r.Code = r.Code and t.Language = :language");

如果我将 HQL 更改为左外连接,我会得到连接异常所需的路径。

您能帮我解决以下问题吗:
1- 我需要更改我的映射文件吗?
2-如果我可以保持映射文件不变,如何在HQL中编写这样的查询?
3- HQL 到底如何运作?为什么这么简单的外连接查询不起作用?我一定是错过了什么!

Edit:
现在我根据使用 CreateSQL 的建议使用以下代码:


ISQLQuery query = session.CreateSQLQuery("select m.MedicineTypeID, t.Name, m.IsDeleted from MedicineType m left outer join Translation t on m.Code = t.Code and t.Language = :language");
query.SetString("language", language);
IList rawLookup = query.List();

IList medicineTypesLookup = new List(rawLookup.Count);
foreach (object[] lookup in rawLookup)
{
    medicineTypesLookup.Add(new Lookup((int)lookup[0], (string)lookup[1], (bool)lookup[2]));
}
return medicineTypesLookup;

这是有效的,但是我想使用 query.List() 直接获取结果而不是自己转换它。
我尝试使用query.AddEntity(typeof(Lookup));但我得到了例外NHibernate.MappingException: No persister for: DAL.Domain.Lookup.
Lookup 只是一个 POCO,并不映射到任何数据库表。它的映射文件很简单<import class="Lookup" />


最后我找到了答案:

ISession session = NHibernateHelper.Session;
ISQLQuery query = session.CreateSQLQuery("select m.MedicineTypeID as ID, t.Name, m.IsDeleted from MedicineType m left outer join Translation t on m.Code = t.Code and t.Language = :language");
query.setString("language", language);
IList lookup = query.SetResultTransformer(Transformers.AliasToBean()).List();
return lookup;
And the lookup is a POCO class with a parameterless constructor and 3 properties ID, Name and IsDeleted.

我要感谢 Kelly 和 Diego Mijelshon 的提示。尽管他们没有提供完整的答案,但使用 Session.CreateSqlQuery() 是一个非常有用的提示。

所以完整的解决方案是Session.CreateSQLQuery和query.SetResultTransformer

注意:Transformers.AliasToBean() 是如此java。

Edit: http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/impl/SQLQueryImpl.html http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/impl/SQLQueryImpl.html为正确的方法setString()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NHibernate 左外连接不相关实体 的相关文章

  • 如何让 NHibernate 缓存获取的子集合?

    我有一个相当简单的条件查询来获取子集合 如下所示 var order Session CreateCriteria
  • 如何将 NHibernate 和 DTO 与 RIA 服务结合使用

    我将 NHibernate 与 RIA 服务和 Silverlight 4 一起使用 我创建 DTO 来通过 RIA 服务传输数据 而不是分发我的域层对象 根据 Martin Fowler 的分布式对象设计第一定律 不要分发您的对象 DTO
  • NHibernate 应如何更新映射为版本的属性

    使用流畅的 NHibernate 我在使用映射的类上有一个属性Version Version x gt x Version 当我保存对象时 Version 属性会按照我的预期在数据库中递增 但对象上的属性值似乎只是有时会发生变化 using
  • NHibernate 忽略长度属性

    运行 SQL Profiler 后 我意识到 NHibernate 正在将字符串映射到nvarchar 4000 我通过指定修复了它type AnsiString and length 在 hbm 文件中 现在正在生成varchar 800
  • 会话已关闭对象名称:“ISession”。在 NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed() - 如何阻止会话过早关闭

    我在带有 MySQL 的 MVC C 应用程序中使用 NHibernate 我正在尝试让多个用户访问该会话 我一直在使用 InRequestScope 在我的会议上 但我仍然得到 System ObjectDisposeException
  • 使用 SQLite 测试 NHibernate“没有这样的表” - 生成模式

    我正在尝试使用内存中的 SQLite 数据库来测试 NHibernate 提供的数据层 我读过很多关于如何进行此设置的博客和文章 但我现在很困惑为什么它不起作用 问题 当我运行单元测试时 我收到错误 没有这样的表 学生 我读过的文章表明这
  • 如何保持长时间运行的NHibernate Session数据一致?

    我在 ASP NET 会话中缓存了 NHibernate 会话 我遇到过一种情况 用户编辑了一个对象 因此它位于 ISession 的第一级缓存中 然后另一个用户编辑了同一个对象 此时 用户 1 仍然可以看到其编辑的原始版本 而用户 2 可
  • NHibernate 具有多个数据库和事务

    我们在理解如何最好地使用 NHibernate 时遇到了一些问题 我们通常拥有相对大量 就表数量而言 的 SQL Server 数据库 而不是一个包含大量对象的数据库 我们正在研究处理多个会话工厂的各种选项 并且可能已经控制住了这一点 但是
  • NHibernate 获取 & 字符串 Id

    我在 NHibernate 上有一个分配了字符串 Id 的实体 并且在通过 Id 获取实体时遇到了一些问题 例子 假设有这样的数据库记录 Id Description AAA MyDescription 现在 如果我使用搜索 ID aaa
  • 对于返回超过1个值的SQL select,当Id为GUID时它们如何排序?

    我想知道 SQL Server 如何对查询返回的数据进行排序 并且各个表的 Id 列都是 uniqueidentifier 类型 我在创建所有 GUID 时使用 NHibernate GuidComb 并执行以下操作 Sheet sheet
  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • Lightspeed 与 NHibernate

    有什么体验光速 http www mindscape co nz products LightSpeed comparison aspx Mindscape 提供的比较并没有过多说明 NHibernate Lightspeed 看起来很灵活
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • NHibernate HQL 相当于 T-SQL 的 TOP 关键字

    NHibernate HQL 相当于 T SQL 的 TOP 关键字是什么 另外 用非 HQL 方式说 给我一门课的前 15 个 是什么意思 在 HQL 中这实际上非常简单 var top15 session CreateQuery fro
  • NHibernate 按 id 逐出

    大家都知道session中有缓存 这个缓存一般可以通过2种方法来清除 会话 驱逐 会话 清除 第二种方法不仅删除单个条目的所有缓存 我有商业方法 它接收大对象的 id 来自 aspx 站点 或有时接收多个 id 并在数据库中进行原生sql操
  • 对 id 属性使用自定义类型

    我有以下课程 public class UserId public UserId int id some validation public override string ToString public class User public
  • 是一对一的关系不好的策略

    用户始终拥有一个钱包 一个钱包始终属于一位用户 由于我想分离与钱夹相关的属性 我创建了 Wallet 对象并能够跟踪钱交易 我创建了 public Wallet Entity
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • NHibernate:错误的列类型:发现浮点数,预期双精度

    我有一个具有属性的域实体类 public virtual double Result get set 该属性正在使用 NHibernate 3 2 代码映射内容进行映射 public class SampleResultMap ClassM
  • NHibernate双向多对多映射列表/包

    我正在努力处理双向多对多映射 其中顺序在一侧很重要 但在另一侧则不重要 我有两个班级 项目和学生 一个项目有很多学生 顺序很重要 方案A John Sally Seth 方案B Alex Seth Amy John 一个学生有很多程序 但顺

随机推荐