4

이 질문은 조금 올랐지 만 나는 아직 좋은 대답을 보지 못했다. 외래 키가없는 두 개의 클래스가 있으며 공통 필드 이외의 실제 관계는 없습니다.이 경우에는 "Title"입니다.NHibernate CreateAlias ​​- 임의의 열에 조인

이것은 기존의 응용 프로그램에서 최근에 가져온 예제를 기반으로합니다. 스키마를 수정할 수 없으므로 단순히 외래 키를 추가하는 것이 옵션이 아닙니다. 내가 찾는 모든 지정된 타이틀과 과정에 대한 모든 전제 조건을 제공 할 쿼리입니다 :

select p.* from course c join prereq p on c.title = p.title 

내가) (가입 같은 매핑을 찾는 게 아니에요, 등, hasMany의(), 이후 그들은 분명히 정의 된 관계를 요구합니다. 매핑이없는 임의의 열을 기반으로 두 개의 테이블을 조인하려고합니다.

비슷한 질문 asked here CreateAlias ​​()를 사용하여 가능하지만 나중에 좋은 예제를 찾지 못했음을 나타내는 것 같습니다.

<class name="Course" table="course"> 
     <id name="id" column="id" type="long"> 
     <generator class="identity" /> 
     </id> 
     <property name="Title" column="Title" type="String" /> 
    </class> 

    <class name="Prereq" table="prereq"> 
     <id name="id" column="id" type="long"> 
     <generator class="identity" /> 
     </id> 
     <property name="Title" column="Title" type="String" /> 
     <property name="PrereqTitle" column="PrereqTitle" type="String" /> 
    </class> 

이것은 내가 생각해 낸 것이지만 작동하지 않습니다. 어떤 제안?

LinqToSql을 사용하면이 작업을 수행하기가 쉽습니다. NHibernate의 Linq 공급자를 사용하여 수행 할 수 있습니까? 필자가 보았던 예제는 제공자가 기본적으로 NH가 사용하는 ICriteria/ICriterion 매직이 수행 한 쿼리를 종결하는 것으로 나타났습니다 - 가능하지는 않지만 실수라고 생각하면 수정 해주십시오.

답변

5

한 가지 방법은 분리 된 조건을 만들고 하위 쿼리를 통해 존재를 수행하는 것입니다.

var dc = DetachedCriteria.For<Course>("c") 
    .SetProjection(Projections.Property("c.Title")) 
    .Add(Restrictions.EqProperty("c.Title", "p.Title")); 

return Session.CreateCriteria<Prereq>("p") 
    .Add(Subqueries.Exists(dc)).List<Prereq>(); 

이 다음과 같은 SQL을 생성 할 where 절 : -

WHERE exists (SELECT title as y0_ 
        FROM Course this_0_ 
        WHERE this_0_.Title = this_.Title) 
관련 문제