4

這個問題似乎出現了一點,我還沒有看到一個很好的答案。我有兩個沒有外鍵的類,除了普通字段外沒有真正的關係,在這種情況下是「標題」。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> 

這是我想到的,但它似乎並不奏效。有什麼建議麼?

 var results = session.CreateCriteria(typeof(Prereq)) 
      .CreateAlias("Course", "C") 
      .CreateAlias("Prereq", "P") 
      .Add(Expression.EqProperty("C.Title", "P.Title")) 
      .Add(Expression.Eq("C.Title", "Course With Prereq")) 
      .List(); 

這很容易做LinqToSql,可以用Linq提供程序來完成NHibernate嗎?我所看到的例子似乎表明,提供者基本上會對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)