2009-11-25 3 views
4

NHibernate에서 쿼리를 작성하려고합니다. Criteria API 나 HQL을 사용하는지 상관하지 않습니다. 쿼리를 작성하는 방법을 알 수 없습니다. 내가 쿼리가 노트의 내용에 특정 단어가있는 주를 포함하는 모든 워크 플로우를 반환 할컬렉션에 대한 NHibernate 다형성 쿼리

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%' 

답변

3

내가 기준 API에 대해 잘 모르겠지만, HQL도, 아주 잘 다형성 쿼리를 처리하는 것 같다

나뿐만 아니라 하위 쿼리를 사용 -수업. 다음과 같은 작업을 기대합니다 :

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

당신이 할 수있는 기준 Restrictions.Eq ("class", typeOf (SomeClass)) – DanB

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...이라고 기입하십시오.

은 하위 클래스에서만 사용할 수있는 속성을 직접 필터링 할 수 있지만 b 그것은이 속성이 정의 된 곳에서 찾은 첫 번째 하위 유형에 대해서만 필터링합니다. 단지 특정 하위에 존재하는 속성에 대해 검색 할 때

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