2011-03-28 107 views
1

我试图将下面的SQL查询转换为NHibernate中的ICriteria。NHibernate的帮助与ICriteria

SELECT DISTINCT m.typeId, t.typeName 
FROM Models m, Types t 
WHERE m.qualifier=? AND m.typeId IS NOT NULL AND m.typeId = t.typeId 

这些都在NHibernate中映射到名为Models和ModelType的类中。 ICriteria.List应该返回一个ModelType类型的列表。

谢谢

回答

1

有好消息和坏消息。您可以创建一个标准,返回一个ModelType列表。但是,他们不会受到会话管理。原因是,一个独特的查询只能返回一个投影,并且投影总是不受管理的。

下面的查询将生成与上述类似的查询,因为它在两个实体之间进行内部连接,并根据这2列返回一个不同的集合。结果转换器应设置为生成可通过属性设置的某种类型。您可以返回一个ModelType列表,但只知道它们不会被会话管理。

Session.CreateCriteria<Model>() 
    .CreateAlias("Type", "t") 
    .Add(Restrictions.Eq("Qualifier", myQualifier) 
    .SetProjection(Projections.Distinct(
     Projections.ProjectionList() 
      .Add(Projections.Alias(Projections.Property("t.Id"), "Id")) 
      .Add(Projections.Alias(Projections.Property("t.TypeName"), "TypeName")))) 
    .SetResultTransformer(Transformers.AliasToBean<ModelType>())