2012-03-10 2 views
1

QueryOver API를 사용하여 아래의 HQL 쿼리를 어떻게 대체 할 수 있습니까? JoinAliasJoinQueryOver 모두가 관련 기업에 대한 경로를 설명하는 표현을 필요로하기 때문에QueryOver를 사용하는 Crossjoin

var sql = "from Role r, Action a where r.Active = :active and a.Active = :active"; 
var result = manager.Session.GetISession().CreateQuery(sql) 
      .SetBoolean("active", true).List(); 

답변

2

나는 ,이 QueryOver에서이 작업을 수행 할 수있는 방법이 생각하지 않습니다.

그러나,이 LINQ - 투 - 자 NHibernate에 달성하기 쉽습니다 :

var result = 
    (from role in manager.Session.GetISession().Query<Role>() 
    from action in manager.Session.GetISession().Query<Action>() 
    where role.Active == true && action.Active == true).ToList(); 

NH 3.2, 여기에 내가 얻을 SQL의 :

select role0_.Id as col_0_0_, 
     action1_.Id as col_1_0_ 
from [Role] role0_, 
     [Action] action1_ 
where role0_.IsActive = 1 /* @p0 */ 
     and action1_.IsActive = 1 /* @p1 */ 
+0

어, 아니 그것을하지 않습니다. 그것은 하나의 SQL 문을 생성 할 것입니다 ... –

+0

위의 해결책은 예상치 못한 마법의 문자열 문제를 피할 수 있지만 그것이 좋다고 믿지는 않습니다. 이는 위의 문장이 NHibernate가 데이터베이스를 여러 번 querry로 유도하기 때문입니다. 역할 테이블에 4 개의 레코드가 있고 작업 테이블에 6 개의 레코드가 있다고 가정 해 보겠습니다. NHibernate가 실행하는 첫 번째 질의는 Role 테이블에서 4 개의 레코드를 반환하는 것이다. 그런 다음 반환 된 각 레코드에 대해 NHibernate는 데이터베이스를 읽어 Action 테이블에서 6 개의 레코드를 가져옵니다. 즉, 데이터베이스에 대한 경로 수는 첫 번째 쿼리에서 반환 된 레코드 수와 같고 한 쿼리에 추가됩니다. – tilonthuduc

+0

Andrew, 나는 노력했다. 그리고 결과는 내가 위에서 기술했던 것이다. 같은 것을 할 수 있을까요? – tilonthuduc

관련 문제