我正在尝试在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%'
答案 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>();