我在我的实体模型中定义了以下实体:
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; }
}
Run Code Online (Sandbox Code Playgroud)
以及上述实体的以下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);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行以下HQL时:
select sub
from MyContainer container
join fetch container.Subs sub
where sub.MyValue = :p1
Run Code Online (Sandbox Code Playgroud)
生成的SQL仅在其中一个子类的WHERE子句中应用约束,但是,生成的JOINS是正确的,即生成以下骨架SQL:
SELECT ...
FROM BaseTable bt
INNER JOIN Sub1Table st1 ON ...
INNER JOIN Sub2Table st2 ON ...
WHERE st1.MyValue = @p1
Run Code Online (Sandbox Code Playgroud)
我希望在WHERE子句中有一个额外的OR:
SELECT ...
FROM BaseTable bt
INNER JOIN Sub1Table st1 ON ...
INNER JOIN Sub2Table st2 ON ...
WHERE st1.MyValue = @p1
OR st2.MyValue = @p2
Run Code Online (Sandbox Code Playgroud)
有没有我缺少的东西,或者有没有办法重新编写HQL,以便我可以引用WHERE子句中的每个子类并直接应用约束(假设它将在生成时生成附加约束) SQL)?
我正在使用NHibernate 3.0.0.
MyValue 应在 Base 中声明和映射。如果不转换为特定类,则无法通过子类中定义的属性来过滤基类:
where (b.class = Sub1 and b.MyValue = :p1) or (b.class = Sub2 and b.MyValue = :p1)
Run Code Online (Sandbox Code Playgroud)
编辑:或者在 FNH1.2 中可以使用联合子类化:
public class BaseMap : ClassMap<Base>
{
public BaseMap()
{
UseUnionSubclassForInheritanceMapping();
Table("BaseTable");
Id(e => e.Id);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1757 次 |
| 最近记录: |