gpt4 book ai didi

sqlite - NHibernate : How to add a criteria on "ROWID" (SQLite special column)

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

我对使用 NHibernate Criteria 创建的 SQLite 表有一个 View 。现在我想获取 View 中一个特定行的位置,我碰巧知道其中的 ID。

由于我使用 GUID 作为主键,因此我指的是每个 SQLite 表都有的 ROWID 列。

SQL 应该如下所示(在 SQLite 中经过测试并且工作正常):

SELECT COUNT(*) FROM Supplier
WHERE ROWID < (SELECT ROWID FROM Supplier WHERE Id = 'e3a279f6-6761-44a8-b037-f4ea82e9595f')
AND [view restrictions]

现在我想使用 Criteria 进行相同的 NHibernate 查询:
Guid id = Guid.Parse("e3a279f6-6761-44a8-b037-f4ea82e9595f")
var rowidSubQuery = DetachedCriteria.For<Supplier>()
[.. flexible view criteria here ..]
.Add(Restrictions.Eq("Id", id))
.SetProjection(Projections.SqlProjection(
"ROWID as row", new[] { "row" }, new IType[] { NHibernateUtil.String }));

int pos = session.CreateCriteria(typeof(Supplier))
.Add(Restrictions.Lt("ROWID", rowid))
.SetProjection(Projections.RowCount())
.UniqueResult<int>();

但它失败并出现 QueryException “无法解析属性:ROWID of:供应商”。我知道我没有属性 Supplier.ROWID,但 ROWID 是 SQLite 中的有效列。我怎样才能访问它?

DetachedCriteria 本身有效。问题似乎出在一线
.Add(Restrictions.Lt("ROWID", rowid))

最佳答案

感谢 Radim,这确实有效!我在我的类中添加了一个新属性并为其添加了一个映射。没想到,但它映射得很好,我可以在查询中使用它。我看到的唯一缺点是我必须为每个项目加载额外的 4 个字节。

public class Supplier 
{
...
public virtual int RowId { get; protected set; }
}

public class SupplierMap : ClassMap<Supplier>
{
...
Map(x => x.RowId).ReadOnly();
}

关于sqlite - NHibernate : How to add a criteria on "ROWID" (SQLite special column),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29473476/

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