我正在编写一个 NHibernate 标准来选择支持分页的数据。我正在使用 COUNT(*) OVER()
SQL Server 2005(+) 中的表达式来获取可用行的总数,如 suggested由 Ayende Rahien。我需要这个数字才能计算出总共有多少页。这个解决方案的美妙之处在于我不需要执行第二个查询来获取行数。
但是,我似乎无法编写工作标准(Ayende 仅提供 HQL 查询)。
这是一个 SQL 查询,它显示了我想要的内容,并且运行良好。请注意,我故意省略了实际的分页逻辑以关注问题:
SELECT Items.*, COUNT(*) OVER() AS rowcount
FROM Items
这是 HQL:
select
item, rowcount()
from
Item item
请注意
rowcount()
函数在自定义 NHibernate 方言中注册并解析为 COUNT(*) OVER()
在 SQL 中。一个要求是使用标准来表达查询。不幸的是,我不知道如何正确处理:
var query = Session
.CreateCriteria<Item>("item")
.SetProjection(
Projections.SqlFunction("rowcount", NHibernateUtil.Int32));
每当我添加投影时,NHibernate 不会选择
item
(就像没有投影一样),只是 rowcount()
虽然我真的需要两者。另外,我似乎无法转换 item
总的来说,只有它的属性,我真的不想列出所有这些。我希望有人能解决这个问题。不管怎么说,还是要谢谢你。
最佳答案
我认为在 Criteria 中这是不可能的,它有一些限制。
您可以在后续查询中获取 id 并加载项目:
var query = Session
.CreateCriteria<Item>("item")
.SetProjection(Projections.ProjectionList()
.Add(Projections.SqlFunction("rowcount", NHibernateUtil.Int32))
.Add(Projections.Id()));
如果你不喜欢它,使用 HQL,你也可以在那里设置最大结果数:
IList<Item> result = Session
.CreateQuery("select item, rowcount() from item where ..." )
.SetMaxResult(100)
.List<Item>();
关于sql-server - 向 NHibernate 标准添加投影会阻止它执行默认实体选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1644776/