nhibernate和;不在「;在聚合子查询中
我有一个实体提醒,它包含一组提醒时间表。 这是我的映射:nhibernate和;不在「;在聚合子查询中,nhibernate,subquery,criteria,Nhibernate,Subquery,Criteria,我有一个实体提醒,它包含一组提醒时间表。 这是我的映射: <class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Reminder" table="Reminders"> <id name="Code" type="System.Guid"> <column name="ReminderCode" /> <generator class="gui
<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Reminder" table="Reminders">
<id name="Code" type="System.Guid">
<column name="ReminderCode" />
<generator class="guid.comb" />
</id>
...
<set access="field.pascalcase-underscore" cascade="all-delete-orphan" inverse="true" lazy="false" name="Schedules" mutable="true">
<key foreign-key="FK_Schedules_Reminders">
<column name="ReminderCode" />
</key>
<one-to-many class="ReminderSchedule" />
</set>
</class>
但我不知道如何将其翻译成对nhibernate有效的标准
有人能帮我吗?非常感谢。您可以通过使用 在HQL中,它应该是(未经测试的):
尽管我不相信我能准确地找到您需要的,但提供的链接应该能帮助您找到正确的方向。由于我无法使用两个子查询(嵌套),我尝试仅使用一个子查询来简化。
我已经获取了已关闭时间表的提醒id(Schedules.rementer.Code)。幸运的是,如果前一个日程表还没有结束,我就不会有另一个日程表了。如果真的发生了,太糟糕了,我将无法管理它 这是我能做的最好的:
ICriteria FiltersCriteria = Session.CreateCriteria<Domain.Reminder>("Reminders");
DetachedCriteria dCriteria = DetachedCriteria.For<Domain.ReminderSchedule>("Schedules")
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("Schedules.Reminder.Code")))
// .Add(Projections.Max("Schedules.NextSchedule").As("MaxSchedule")))
.Add(Restrictions.Eq("Schedules.Closed", true));
FiltersCriteria.Add(Subqueries.PropertyIn("Reminders.Code", dCriteria));
ICriteria FiltersCriteria=Session.CreateCriteria(“提醒”);
DetachedCriteria=DetachedCriteria.For(“附表”)
.SetProjection(Projections.ProjectionList()项目)
.Add(projects.GroupProperty(“Schedules.rementer.Code”))
//.Add(projects.Max(“Schedules.NextSchedule”).As(“MaxSchedule”))
.添加(限制。等式(“附表。关闭”,真));
添加(subquerys.PropertyIn(“rementers.Code”,dCriteria));
我想这个示例代码是不言自明的。我在子查询中使用了一个DetachedCriteria,并将其用作我的条件的参数@sjonny:谢谢你的回答。我希望找到一些非HQL的东西。@LeftyX:基本上,任何可以用HQL编写的东西都可以作为标准编写;这只是有点不那么直观(至少在我看来)。关于查询API-AFAIK,它还没有涵盖所有内容,不确定它是否适用于您的情况。@Sjonny:是的,我可以理解。HQL更简单,但我使用了条件,希望我能做所有事情。事实上,我差不多做到了。我不得不稍微简化我的查询,但我已经实现了我想要的(几乎).我很快会发布我的解决方案。@LeftyX:你当然可以。正如我所说的-AFAIK标准等同于HQL,所以可以在HQL中编写的任何内容都可以在标准中编写。我自己并不是标准方面最伟大的专家(我更喜欢尽可能使用Linq),但如果你愿意,我可以尝试一下这个问题。让我知道你进展如何。@Sjonny:谢谢。我明天会编一些代码。我在网上找到了不同的例子,并把它们放在一起。这是nhibernate版本2还是3?@Rippo:我使用的是NH3.0.0.4000。
SELECT * FROM Reminders
WHERE ReminderCode
NOT IN (
SELECT LastReschedule.ReminderCode FROM (
SELECT ReminderCode, MAX(NextSchedule) MaxSchedule
FROM ReminderSchedules
WHERE Closed = 1
GROUP BY ReminderCode) LastReschedule
)
ORDER BY Reminders.ReminderCode
from Reminders as R
where R.ReminderCode not in
( select RS.ReminderCode
from ReminderSchedules as RS
where RS.NextSchedule = (select max(NextSchedule) from ReminderSchedules as Inner where RS.Closed = 1)
)
ICriteria FiltersCriteria = Session.CreateCriteria<Domain.Reminder>("Reminders");
DetachedCriteria dCriteria = DetachedCriteria.For<Domain.ReminderSchedule>("Schedules")
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("Schedules.Reminder.Code")))
// .Add(Projections.Max("Schedules.NextSchedule").As("MaxSchedule")))
.Add(Restrictions.Eq("Schedules.Closed", true));
FiltersCriteria.Add(Subqueries.PropertyIn("Reminders.Code", dCriteria));