gpt4 book ai didi

nhibernate - 使用 Critera 查询时仅检索特定列?

转载 作者:行者123 更新时间:2023-12-03 12:32:16 25 4
gpt4 key购买 nike

我正在为我公司正在做的一个项目推荐 NHibernate,我想知道 NHibernate 是否可以优化为在使用 Criteria 查询语言时仅检索表上的特定列。

例如。假设我有一个包含 30 列的表,它使用 NHibernate 映射到一个对象,该对象是与表的一对一匹配。但是,对于系统的特定功能,我只关心其中的两列。

现在,我知道我可以使用 HQL 并执行 CreateQuery这将实现这一点,但这需要我为我想有选择地检索的每个字段组合创建一个构造函数。从维护的角度来看,这可能是一个巨大的痛苦,因为直到运行时我才会发现丢失的构造函数。

我喜欢 Criteria 查询语言,因为它生成参数化 SQL 而不是来自 HQL 的直接 SQL 查询。我看到有一个“排除”模型不包括某些列,但在大多数情况下,我将包含比排除更多的列。

感谢下面的评论,我研究了预测,这对我来说仍然不是理想的情况。使用以下内容时:

var list = session
.CreateCriteria(typeof (Task))
.SetProjection(Projections
.ProjectionList()
.Add(Projections.Property("Id")))
.List();

我最终得到了变量 list只是作为整数,我希望拥有完整的 Task 对象,但所有字段都设置为默认值。这甚至可能吗?到目前为止,我所看到的一切都说不。

最佳答案

是的,您可以通过使用投影来使用标准查询来做到这一点。只需投影您希望使用的属性,并且只有那些将包含在已编译查询的 select 子句中。

http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection

更新编辑

有几种方法可以做到这一点,但是有一些限制。 1)NHibernate方式。

var list = session.CreateCriteria(typeof (Task))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("ID"), "ID")
)
.SetResultTransformer(Transformers.AliasToBean(typeof (Task)))
.List();

只需将属性名称作为别名分配给您的投影,AliasToBean 转换器就会将这些投影映射到实际类。此方法的限制是您映射的任何属性都必须在 POCO 类中有一个 setter,这可以是一个 protected setter,但它必须有一个 setter。

您也可以使用 linq 以稍微不同的方式执行此操作
var list = session.CreateCriteria(typeof (Task))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"))
.Add(Projections.Property("ID"))
)
.List<IList>()
.Select(l => new Task() {Name = (string) l[0], ID = (Guid) l[1]});

这只是使用 linq 将输出的索引列表映射到 Task 类的新实例中。与上述相同的限制适用,只是这有点更严格,因为映射的所有属性都必须有一个公共(public) setter ,因为这是 linq 用来填充对象的。

我希望这可以帮助你。

关于nhibernate - 使用 Critera 查询时仅检索特定列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/695917/

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