2011-01-20 56 views
5

我正在使用NHibernate,並有這個查詢的問題...我有一個類,我想要使用它的ID獲取。一切都好。不過,如果設置了其他條件,我還希望將Item類的bool屬性設置爲true。具體來說,這個屬性被命名爲IsMarked,告訴Item是否被標記爲/請求它的用戶,並且這個信息被設置在提供Item和User之間關係的表上。基於NHibernate查詢中的不同表設置值

目前我正在提取Item,然後找到引用 - 如果可以找到引用,則將屬性更新爲true。我可以在一個查詢中做到這一點嗎?

var item = Session.Get<Item>(itemId); 

var flaggedResult = Session.CreateCriteria<ItemWithUserFlag>() 
    .Add(Restrictions.Eq("User.Id", userId)) 
    .Add(Restrictions.Eq("Item", item)) 
    .List<ItemWithUserFlag>(); 

if (flaggedResult.Count > 0) 
    item.IsMarked = true; 

return item; 
+0

如何你的類映射?用戶和項目之間是否存在多對多的關聯? – 2011-01-25 20:35:27

+0

我正在使用Fluent進行映射。在單獨的類ItemWithUserFlag中表示了多對多關係。用戶與項目沒有直接關係,項目與用戶沒有直接關係。 ItemWithUserFlag將參考設置爲用戶和項目。 – stiank81 2011-01-27 15:16:37

回答

7

如何在你的屬性映射使用與filter沿formula

<property name="IsMarked" formula="(select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = ItemId and ItemWithUserFlag.UserId = :UserFilter.userId)" /> 

和DEF過濾:

<filter-def name="UserFilter"> 
    <filter-param name="userId" type="Int32"/> 
</filter-def> 

,這將導致類似

SELECT Item.*, (select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = Item.ItemId and ItemWithUserFlag.UserId = ?) AS IsMarked FROM Item 

只要IsMarked被定義爲bool,如果count(*)返回0它將被轉換爲false,如果有的話> 0它將被轉換爲true

編輯:流利表示

public class ItemMap : ClassMap<Item> 
{ 
    public ItemMap() 
    { 
     /// ... whatever 
     Map(x => x.IsMarked).Formula("(select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = ItemId and ItemWithUserFlag.UserId = :UserFilter.userId)"); 
    } 
} 

public class UserFilter : FilterDefinition 
{ 
    public UserFilter() 
    { 
     WithName("UserFilter") 
      .AddParameter("userId", NHibernate.NHibernateUtil.Int32); 
    } 
}