gpt4 book ai didi

c# - NHibernate - 使用 ICriteria 加入子查询

转载 作者:太空宇宙 更新时间:2023-11-03 14:36:25 25 4
gpt4 key购买 nike

我有一个 SQL 查询,需要使用 NHibernate 的 ICriteria API 表示。

   SELECT u.Id as Id, 
u.Login as Login,
u.FirstName as FirstName,
u.LastName as LastName,
gm.UserGroupId_FK as UserGroupId,
inner.Data1,
inner.Data2,
inner.Data3
FROM dbo.User u inner join
dbo.GroupMember gm on u.Id = gm.UserAnchorId_FK
left join
(
SELECT
di.UserAnchorId_FK,
sum(di.Data1) as Data1,
sum(di.Data2) as Data2,
sum(di.Data3) as Data3
FROM
dbo.DailyInfo di
WHERE di.Date between '2009-04-01' and '2009-06-01'
GROUP BY di.UserAnchorId_FK
) inner ON inner.UserAnchorId_FK = u.Id
WHERE gm.UserGroupId_FK = 195

到目前为止的尝试包括映射“User”和“DailyInfo”类(我的实体)以及使 DailyInfo 对象成为 User 对象的属性。然而,如何映射它们之间的外键关系仍然是个谜,即

<one-to-one></one-to-one>

<one-to-many></one-to-many>

<generator class="foreign"><param name="property">Id</param></generator> (!)

网络上的解决方案通常与 WHERE 子句中的子查询有关,但是我需要在该子查询上进行左连接,以确保为未连接的行返回 NULL 值。

我觉得我应该为外部查询使用 Criteria,然后与 DetachedCriteria 形成“连接”来表示子查询?

最佳答案

我遇到了同样的问题,但我没有得到任何解决方案。所以我用拦截器进行了破解

条件生成的查询

SELECT u.Id as Id, 
u.Login as Login,
u.FirstName as FirstName,
u.LastName as LastName,
gm.UserGroupId_FK as UserGroupId,
inner.Data1,
inner.Data2,
inner.Data3
FROM dbo.User u inner join
dbo.GroupMember gm on u.Id = gm.UserAnchorId_FK
InnerJoin inner ON inner.UserAnchorId_FK = u.Id
WHERE gm.UserGroupId_FK = 195

这里 InnerJoin 是一个与 User 具有 1-1 关系的虚拟表。InnerJoin中的列是内连接子查询的返回值

User 和 InnerJoin 的条件

DetachedCriteria forUser = DetachedCriteria.For<User>();
forUser.CreateCriteria("InnerJoin");

现在你可以创建拦截器来编辑查询了

public interface CustomInterceptor : IInterceptor, EmptyInterceptor
{
SqlString IInterceptor.OnPrepareStatement(SqlString sql)
{
string query = sql.ToString();
if (query.Contains("InnerJoin "))
{
sql = sql.Replace("InnerJoin ", "(select [vals] form dbo.DailyInfo [where conditions])");
}
return sql;
}
}

对于来自多个表的返回值,包括连接子查询,您可能必须使用 NHibernate DTO而session是这样的

CustomInterceptor custonInterceptor=new CustomInterceptor(); 

sessionFactory.OpenSession(custonInterceptor);

最终的查询将是你想要得到的结果

关于c# - NHibernate - 使用 ICriteria 加入子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/856131/

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