首页 文章

(流畅)nhibernate - 根据查询中引用的基类的子类选择Object

提问于
浏览
2

我有4个类Person(有一个类型Animal的引用(将包含一个继承Animal的类))Animal(抽象基础)Dog(继承Animal)Cat(继承Animal)

为了清楚我正在使用Table-per-class映射,所以我有一个Animal,Dog和Cat数据库表 .

我想要做的是选择每个有狗的人,如果可能的话,能够过滤狗类中的字段 . 如果可能的话,我宁愿通过类型安全代码完成所有这些操作,而不是直接使用SQL或字符串来阻止代码中断 .

(流利的1.2)nhibernate(3.1)是否可以实现?有人可以开始指点我正确的方向吗?我的查询比解释的要复杂一些,但这是它的核心 .

还有一点偏离主题,但有没有任何地方有mapSession.QueryOver()下的所有方法的描述?那里有很多东西,有些是显而易见的,但像Fetch等其他人并不清楚他们都做了什么,可能就是为什么我这么难找到 .

---编辑类供参考---

public class Person
{
    Animal pet;
    public string Name;
}

public abstract class Animal
{
    public int ID;
    public string Name;
}

public class Dog : Animal
{
    public string Color;
}

public class Cat : Animal
{
    public string someOtherVal;
}

只使用一个会话对象,我希望得到所有不同的人名字,他们有一个类型狗和狗是棕色的宠物 .

这是我想要最终得到的最终查询,但我试着开始只是让那些有狗的人,因为我觉得这很容易,但似乎事实并非如此 .

我试过的原始Querys是

Dog dog = null;
            var test2 = session.QueryOver<Person>()
                .Inner.JoinAlias(x=>x.Pet, ()=> dog)
                .Where(()=>dog != null)
                .List();

我也有预测,以减少它的明显名称,但我仍然无法限制只有狗的人 .

1 回答

  • 0

    以下是如何完成此操作的示例:

    http://jameskovacs.com/2011/02/16/getload-polymorphism-in-nhibernate-3/

    var animal = session.CreateCriteria<Animal>()
                        .Add(Restrictions.IdEq(dogId))
                        .UniqueResult<Animal>();
    

    你也可以试试这样的东西,我不是百分百肯定它会起作用,但是你可以尝试一下:

    var animal = session.CreateCriteria<Animal>()
                         .Add(Restrictions.On<Dog>(m=>m.Id == 1))
                         .UniqueResult<Animal>();
    

    这有帮助吗?

相关问题