命名查询和继承

Posted

技术标签:

【中文标题】命名查询和继承【英文标题】:Named Query and Inheritance 【发布时间】:2011-04-20 22:12:02 【问题描述】:

在 NHibernate 上运行命名查询时遇到了一些问题。我设置为返回值的类是Organization——不是抽象的——我还有第二个类(继承自这个类),称为FullOrganization。我每个具体的类模式都有一个表,其他一切都工作得很好,但是在运行命名查询时我不断收到异常(顺便说一句,它没有提供任何细节)。

映射接近如下:

<hibernate-mapping 
xmlns="urn:nhibernate-mapping-2.2" 
namespace="XXX" 
assembly="XXX" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:nhibernate-mapping-2.2 ..\nhibernate-mapping.xsd" auto-import="false">
<class name="Organization" table="Organizations" lazy="false">
    <id name="Identity" column="Id">
        <generator class="identity"/>
    </id>

    <property name="Name" column="Name" />
    <many-to-one name="OrganizationType" column="OrganizationTypeId"/>
...
            <joined-subclass name="FullOrganization" table="FullOrganizations" lazy="false">
        <key column="OrganizationId"/>
                    ...
            </joined-subclass>
</class>

命名查询类似于:

<sql-query name="OrganizationSearch" read-only="true" cacheable="false">
<return class="Organization" />
<![CDATA[
  SELECT *
  FROM Organizations o
  INNER JOIN OrganizationTypes ot ON o.OrganizationTypeId = ot.Id 
  LEFT JOIN FullOrganizations fo ON o.Id = fo.OrganizationId
  WHERE 
    // Several Filters Here
]]>

我应该如何映射查询结果?请注意返回的对象可能是 Organization 或 FullOrganization 的实例。

【问题讨论】:

【参考方案1】:

如果我对问题的理解正确,您有两种搜索方法吗?即

SearchOrganisationsSearchFullOrganisations

如果答案是肯定的,那么我会删除

&lt;return class="Organization" /&gt;

在代码中你可以使用AliasToBeanResultTransformer

一种方法

return Session
    .GetNamedQuery("OrganizationSearch")
    .SetString("Param1", param1)
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(Organization )))
    .List<Organization >();

还有

return Session
    .GetNamedQuery("OrganizationSearch")
    .SetString("Param1", param1)
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(FullOrganization )))
    .List<FullOrganization >();

如果您有一种方法,则可以设置一个开关以应用所需的SetResultTransformer

【讨论】:

实际上我期待我可以使用单一搜索方法,这就是为什么我在 sql 查询上执行 LEFT JOIN,而 WHERE 部分的条件都是 OR (fo. 不是 NULL 并且 fo. LIKE :pattern)。但是现在你提到它,我可能对这个假设是错误的,因为 NHibernate 应该创建 Organization 或 FullOrganization 实例,这取决于 FullOrganization 字段不为 NULL... 我没有遵循这个确切的实现,而是对结果集使用了 DTO。但是,我将答案标记为已接受,因为它引导我解决问题。谢谢!

以上是关于命名查询和继承的主要内容,如果未能解决你的问题,请参考以下文章

day24 面向对象,交互,组合,命名空间,初始继承

2017-04-14命名空间访问修饰符封装继承多态

面向对象之类命名空间与对象实例的命名空间,组合以及继承

手电筒查询

使用 Laravel Eloquent 和命名绑定的 SQL 查询:混合命名参数和位置参数

Hibernate命名查询