【发布时间】:2010-06-09 09:12:29
【问题描述】:
我的实体模型中定义了以下实体:
public class MyContainer
{
public virtual ICollection<Base> Subs { get; set; }
}
public abstract class Base
{
public virtual Guid Id { get; set; }
}
public abstract class Sub1 : Base
{
public virtual int MyValue { get; set; }
}
public abstract class Sub2 : Base
{
public virtual int MyValue { get; set; }
}
以及上述实体的以下 FluentNHibernate 映射:
public sealed class BaseMap : ClassMap<Base>
{
public BaseMap()
{
Table("BaseTable");
Id(e => e.Id);
}
}
public sealed class Sub1Map : SubClassMap<Sub1>
{
public Sub1Map()
{
Table("Sub1Table");
KeyColumn("BaseId");
Map(e => e.Myvalue);
}
}
public sealed class Sub2Map : SubClassMap<Sub2>
{
public Sub2Map()
{
Table("Sub2Table");
KeyColumn("BaseId");
Map(e => e.Myvalue);
}
}
当我运行以下 HQL 时:
select sub
from MyContainer container
join fetch container.Subs sub
where sub.MyValue = :p1
生成的 SQL 仅在其中一个子类的 WHERE 子句中应用约束,但是生成的 JOINS 是正确的,即生成以下骨架 SQL:
SELECT ...
FROM BaseTable bt
INNER JOIN Sub1Table st1 ON ...
INNER JOIN Sub2Table st2 ON ...
WHERE st1.MyValue = @p1
我期望 WHERE 子句中有一个额外的 OR:
SELECT ...
FROM BaseTable bt
INNER JOIN Sub1Table st1 ON ...
INNER JOIN Sub2Table st2 ON ...
WHERE st1.MyValue = @p1
OR st2.MyValue = @p2
我是否缺少某些东西,或者有没有办法重写 HQL,以便我可以引用 WHERE 子句中的每个子类并直接应用约束(假设它会生成附加约束在生成的 SQL 中)?
我正在使用 NHibernate 3.0.0。
【问题讨论】:
-
如果我使用过时的 JoinedSubClass() 方法而不是使用 SubclassMap 创建映射,它会更改 WHERE 子句中出现约束的顺序。我不明白...这应该有效,不是吗?
标签: nhibernate hql