gpt4 book ai didi

sql-server - 向 NHibernate 标准添加投影会阻止它执行默认实体选择

转载 作者:行者123 更新时间:2023-12-03 17:17:46 24 4
gpt4 key购买 nike

我正在编写一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com