【发布时间】:2010-07-21 09:26:30
【问题描述】:
我正在开发一个 .NET C# 项目,在该项目上我必须使用 NHibernate 映射属性将我的对象映射到我的数据库中的表。
现在让我们解释一下我的问题是什么。
我有两个映射类,例如 ClassA 和 ClassB。在我的数据库中,表 A 包含一个引用表 B 主键的外键。因此,我向 ClassA 添加了一个以多对一方式映射的 ClassB 实例:
private ClassB b;
[ManyToOne(0, Name = "B", Column = "ID_TABLE_B_TABLE_A", Class = "ClassB", Update = false, Insert = false)]
public virtual ClassB B
{
get { return b; }
set { b= value; }
}
现在,我想在访问 ClassA 时检查 ClassB 字段的值。我用 HQL 编写查询:
Session.CreateQuery("select a.Id from ClassA a where a.ClassB.Name = 'xxx' ");
这是生成的 SQL:
select tablea0_.ID_TABLE_A as col_0_0_
from TABLE_A tablea0_, TABLE_B tableb1_
where tablea0_.ID_TABLE_B_TABLE_A = tableb1_.ID_TABLE_B
and tableb1_.NAME_TABLE_B='xxx'
我认为这种 HQL 查询应该生成一个 join 语句而不是 where 语句,因为我已经定义了两个类之间的多对一关联。像这样的东西会更好:
select tablea0_.ID_TABLE_A as col_0_0_
from TABLE_A tablea0_
left join TABLE_B tableb1_ on tableb1_.ID_TABLE_B = tablea0_.ID_TABLE_B_TABLE_A
where tableb1_.NAME_TABLE_B='xxx'
在我看来,join 看起来更干净。我想知道是否有一种方法可以相应地设置 NHibernate 的行为,而无需在 HQL 查询中明确指定连接语句。
任何帮助将不胜感激!
【问题讨论】:
-
什么版本的 NHibernate 和你使用什么数据库?
-
我正在使用 NHibernate 2.1.2 版、.Net Framework 3.5 版和 Oracle 11g。
标签: c# .net nhibernate hql