【问题标题】:NHibernate Polymorphic Query on a Collection集合上的 NHibernate 多态查询
【发布时间】:2010-12-20 09:34:36
【问题描述】:

我正在尝试在 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%'

【问题讨论】:

    标签: nhibernate hibernate hql criteria


    【解决方案1】:

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

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

    【讨论】:

    • 在标准中你可以做 Restrictions.Eq("class",typeOf(SomeClass))
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多