集合上的NHibernate多态查询

集合上的NHibernate多态查询,nhibernate,hibernate,hql,criteria,Nhibernate,Hibernate,Hql,Criteria,我想用NHibernate写一个查询。我并不在乎是否使用CriteriaAPI或HQL,我只是不知道如何编写查询 这是我的模型: public class LogEntry { public DateTime TimeCreated { get; set; } } public class Note : LogEntry { public string Content { get; set; } } public class Workflow { public IList<LogEntr

我想用NHibernate写一个查询。我并不在乎是否使用CriteriaAPI或HQL,我只是不知道如何编写查询

这是我的模型:

public class LogEntry { public DateTime TimeCreated { get; set; } }
public class Note : LogEntry { public string Content { get; set; } }

public class Workflow { public IList<LogEntry> Log { get; set; } }

我不知道是否有更好的方法,但我使用子查询:

from Workflow w
  join w.Log l
where l in (
  select n 
  from Note n 
  where n.Content like '%keyword%'
)
(如果这不起作用,请在中写入
l.id(选择n.id.

在条件中,您可以直接筛选仅在子类上可用的属性,但不应该这样做,因为它只筛选定义此属性的第一个子类型

我也使用子查询:

DetachedCriteria subquery = DetachedCriteria.For<Note>("n")
  .Add(Expression.Like("n.Content", "%keyword%"))
  .SetProjection(Projections.Property("n.id"));

IList<Workflow> workflows = session.CreateCriteria<Workflow>("w")
  .CreateCriteria("w.Log", "l")
  .Add(Subqueries.PropertyIn("l.id", subquery))
  .List<Workflow>();
DetachedCriteria子查询=DetachedCriteria.For(“n”)
.Add(Expression.Like(“n.Content”,“关键字%”))
.SetProjection(Projections.Property(“n.id”));
IList工作流=session.CreateCriteria(“w”)
.CreateCriteria(“w.Log”、“l”)
.Add(子查询.PropertyIn(“l.id”,子查询))
.List();

我不确定Criteria API,但HQL似乎能很好地处理多态查询,即使在搜索仅存在于特定子类中的属性时也是如此。我希望以下方法能够奏效:

from Workflow w join w.Log l where l.class = Note and l.Content like '%keyword%'

在Criteria中,您可以执行Restrictions.Eq(“class”,typeOf(SomeClass))
from Workflow w join w.Log l where l.class = Note and l.Content like '%keyword%'