【问题标题】:HQL query over sub-classes对子类的 HQL 查询
【发布时间】: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


【解决方案1】:

MyValue 应该在 Base 中声明和映射。如果不强制转换为特定类,则无法通过子类中定义的属性过滤基类:

where (b.class = Sub1 and b.MyValue = :p1) or (b.class = Sub2 and b.MyValue = :p1)

编辑: 或者在 FNH1.2 中可以使用联合子类化:

public class BaseMap : ClassMap<Base>
{
    public BaseMap()
    {
        UseUnionSubclassForInheritanceMapping();
        Table("BaseTable");
        Id(e => e.Id);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多