【问题标题】:Conditional join and mapping with NHibernate使用 NHibernate 进行条件连接和映射
【发布时间】:2026-02-05 23:00:02
【问题描述】:

我想知道如何使用 NHibernate 映射以下内容:我有一个 User 类、一个 Preference 类和一个 PreferenceOption 类。

用户有许多偏好(这些偏好又具有偏好选项)。系统的工作方式是为所有用户提供一组默认的首选项,单个用户可以通过指定自己的默认值来覆盖这些默认值。这样我们只需要存储系统默认值(由 Preference 和 PreferenceOption 表/类表示)和用户的任何特定默认值(由 UserPreferenceOption 表/类表示)。

理想情况下,我想做的是映射 PreferenceOption 类,以便它在 UserPreferenceOption 上执行左外连接以包含用户的特定默认值如果存在。请记住,用户可能没有覆盖系统默认值。

偏好

标识 |名称

PreferenceOption

标识 |价值 |是默认值 | Preference_id

用户偏好选项

标识 |使用这个 | Preference_id |选项ID |用户id

SQL 查询看起来像这样:

select  PO.Id, PO.Value, PO.IsDefault, PO.Preference_Id, UPO.UseThis
from    PreferenceOption PO Left Outer Join UserPreferenceOverride UPO on PO.Id = UPO.Option_id
and UPO.Profile_id = THE_USER_ID

是否可以用 NHibernate 映射它?

【问题讨论】:

    标签: nhibernate join conditional


    【解决方案1】:

    我不太了解你的 SQL 语句 - 但我在 NHibernate 中做了类似的事情,它的工作原理是这样的: 您将首选项和用户首选项映射到两个单独的包。然后制定一个逻辑,对于每个偏好,您首先查看用户偏好选项,然后选择默认偏好选项。

    NHibernate 中的查询可以使用左外连接:例如如果您使用标准 API,则为 createAlias("products", "product", Criteria.LEFT_JOIN),而在 HQL 中则为 from Cat as cat join cat.mate as mate left join cat.kittens as kitten

    我希望这会有所帮助。

    【讨论】: