我试图使用 NHibernate 中的 Criteria API 获得不同的结果。我知道使用 HQL 可以做到这一点,但我更喜欢使用 Criteria API 来执行此操作,因为我的应用程序的其余部分仅使用此方法编写。我找到这个论坛帖子 http://forum.hibernate.org/viewtopic.php?t=941669,,但一直无法让它发挥作用。有没有办法使用标准 API 来获取不同的结果集?
编辑:在执行此操作时,我还想排除主键列(这也是一个标识),并获取剩余的不同记录。有没有办法做到这一点?事实上,不同的记录返回重复项,因为每行的主键都是唯一的,但所有其他字段都是相同的。
要执行不同的查询,您可以将条件上的投影设置为 Projections.Distinct。然后包含您希望返回的列。然后,通过将结果转换器设置为 AliasToBeanResultTransformer - 传入结果应转换为的类型,将结果转回强类型对象。在此示例中,我使用与实体本身相同的类型,但您可以专门为此查询创建另一个类。
ICriteria criteria = session.CreateCriteria(typeof(Person));
criteria.SetProjection(
Projections.Distinct(Projections.ProjectionList()
.Add(Projections.Alias(Projections.Property("FirstName"), "FirstName"))
.Add(Projections.Alias(Projections.Property("LastName"), "LastName"))));
criteria.SetResultTransformer(
new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person)));
IList<Person> people = criteria.List<Person>();
这将创建类似于以下内容的 SQL(至少在 SQL Server 中):
SELECT DISTINCT FirstName, LastName from Person
请注意,只有您在投影中指定的属性才会填充到结果中。
这种方法的优点是过滤是在数据库中执行的,而不是将所有结果返回到应用程序然后再进行过滤——这是 DistinctRootEntityTransformer 的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)