gpt4 book ai didi

nhibernate - 对子类的 HQL 查询

转载 作者:行者123 更新时间:2023-12-03 17:20:40 25 4
gpt4 key购买 nike

我的实体模型中定义了以下实体:

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。

最佳答案

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);
}
}

关于nhibernate - 对子类的 HQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3004443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com