【发布时间】:2011-05-19 16:15:34
【问题描述】:
我有一个实体 Reminder,其中包含 ReminderSchedule 的集合。 这是我的映射:
<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>
这是实体ReminderSchedule的映射:
<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="ReminderSchedule" table="ReminderSchedules">
<id name="Code" type="System.Guid">
<column name="ReminderScheduleCode" />
<generator class="guid.comb" />
</id>
<property name="NextSchedule" type="System.DateTime">
<column name="NextSchedule" index="ReminderScheduleK01" not-null="true" />
</property>
<many-to-one class="Reminder" foreign-key="FK_ReminderScheduleToReminder" name="Reminder">
<column name="ReminderCode" index="ReminderScheduleK02" not-null="true" />
</many-to-one>
</class>
ReminderSchedules 表包含与提醒关联的每个新计划的记录。
我可以关闭一个时间表 (Closed = 1) 并重新安排一个新的时间表。
在这种情况下,我将有一个 Closed = 0 的新记录,并且 NextSchedule 字段将包含下一个计划的日期/时间。
我已经在使用 CreateCriteria 来过滤提醒,而且效果非常好。 现在我想获取没有打开任何 ReminderSchedule 的提醒。
我已经想出了如何通过查询来做到这一点:
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
但我不知道如何将其转换为适用于 nhibernate 的标准。
有没有人可以帮助我?将不胜感激。
【问题讨论】:
-
这是 nhibernate 版本 2 还是 3?
-
@Rippo:我正在使用 NH 3.0.0.4000。
标签: nhibernate subquery criteria