2009-09-18 40 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