关于集合的NHibernate多态查询

时间:2009-11-25 17:40:50

标签: nhibernate hibernate hql criteria

我正在尝试在NHibernate中编写查询。如果我使用Criteria API或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; } }

我希望查询返回包含注释的所有工作流,其中包含注释内容中的特定单词。

在伪SQL中,我会这样写:

select w.*
from Workflow w
join w.Log l where l is class:Note
where (Note)l.Content like '%keyword%'

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

from Workflow w
  join w.Log l
where l in (
  select n 
  from Note n 
  where n.Content like '%keyword%'
)

(如果这不起作用,请写l.id in (select 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>();