2009-09-18 43 views
1

類被定義爲這樣的:HQL到CriteriaQuery中轉換

class User { 
    public int ID { get; set; } 
    public string OpenID { get; set; } 
    public IList<Tag> Tags { get; set; } 
} 

的OpenID被設定爲天然-ID,以使得第二級高速緩存識別此。

我有這個HQL查詢返回用戶標籤列表。

db.CreateQuery("select Tags from User where OpenID = :openId") 
    .SetString("openId", openId) 
    .List<Tag>(); 

據我所知HQL沒有語法識別OpenID的自然-ID,但CriteriaQuery中有(用Restrictions.naturalId()...)

所以,我需要這種轉換查詢到CriteriaQuery。 東西在這個方向:

db.CreateCriteria<User>() 
    .Add(Restrictions.NaturalId().Set("OpenID", openId)) 
    //I need to tell criteria query that I want to return Tags property here - I don't know how to do that 
    .List<Tag>(); 

回答

0
db.CreateCriteria<User>() 
    .SetProjection(Projections.Property("Tags")); 
    .Add(Restrictions.Eq("OpenID", openId)); 
    .List<Tag>(); 

不知道這NaturalId,從未使用過它,我可能會再補充一個正常的限制。

+0

這似乎是合乎邏輯的,這將工作,但事實並非如此。 它返回一個項目列表,該項目爲空。 執行的查詢是這樣的: SELECT this_.ID作爲y0_ FROM [USER] THIS_ WHERE this_.OPENID = @ P0; 映射的標籤是這樣的: <袋名稱= 「標記」 表= 「USER_TAG」> <高速緩存利用率= 「非嚴格讀寫」/> <列名= 「ID_USER」/> <許多一對多類= 「BeriMe.Biz.Domain.Tag」> <列名= 「ID_TAG」/> dmonlord 2009-09-18 10:23:51

+0

如果你有興趣NaturalId ()你應該閱讀這個:http://ayende.com/Blog/archive/2009/06/23/nhibernate-ltnatural-idgt.aspx – dmonlord 2009-09-18 10:26:00