来自Query的NHibernate Collection属性(非流利)

时间:2018-04-24 18:53:47

标签: nhibernate nhibernate-mapping

是否可以在通过自定义SQL查询填充集合的实体上拥有只读集合?

我有3个班级 - VillageReportArmy - 每个班级都有一个表格支持。我希望Village拥有属性“ReportsAsDefender”,该属性是Reports的集合,其中Army中的防御Report属于给定{ {1}}:

Village

我希望此查询的结果可以作为我SELECT village.Id as VillageId, report.* FROM armies army join reports report on report.DefendingArmyId = army.Id join villages village on village.Id = army.VillageId 类的集合访问。这可能只使用XML映射,但我找不到任何有用的东西。

我没有使用Fluent。

编辑1:我上传了当前的源代码并对SQL数据进行了示例处理,以便重现我的问题:https://github.com/tylercamp/NHTW

我还更新了上面的SQL查询以匹配我当前的更改。

根据@RadimKöhler建议的更改,我在调用Village时遇到异常:someVillage.ReportsAsDefender.ToList(),然后是一些荒谬的MySQL:

could not initialize a collection:

我不知道“asd”来自何处,也不知道任何其他格式。字符串“asd”没有出现在我的代码库中。

我的.hbm.xml文件中的相关实体包含:

SELECT
    reportsasd0_.VillageId as villageid11_4_1_,
    reportsasd0_.Id as id1_4_1_,
    reportsasd0_.Id as id1_4_0_,
    reportsasd0_.TribalWarsId as tribalwarsid2_4_0_,
    reportsasd0_.WorldId as worldid3_4_0_,
    --- ... and a for more nonsensical "selects"

FROM Reports reportsasd0_ WHERE reportsasd0_.VillageId=?

我的 <class name="Village" table="Villages"> <id name="Id"> <generator class="increment" /> </id> <property name="TribalWarsId" /> <property name="WorldId" /> <property name="Name" /> <property name="OwnerId" /> <!-- Where "villa_reports_as_defender" is the name of the view query shown above --> <bag name="ReportsAsDefender" table="villa_reports_as_defender" mutable="false" lazy="true" inverse="true"> <key column="VillageId" /> <one-to-many class="Report"/> </bag> </class> <!-- Report --> <class name="Report" table="Reports"> <id name="Id"> <generator class="increment" /> </id> <property name="TribalWarsId" /> <property name="WorldId" /> <property name="AttackingArmyId" /> <property name="DefendingArmyId" /> <property name="RemainingAttackingArmyId" /> <property name="RemainingDefendingArmyId" /> <property name="DodgedArmyId" /> <property name="OccurredAt" /> <property name="LaunchedAt" /> </class> 课程具有以下属性:

Village

1 个答案:

答案 0 :(得分:1)

任何相关数据都应映射为标准实体。即使这是一个视图(问题可能是我们将体验到的有效数据加载方式......)

此类视图必须包含关系列(例如 Parent_ID )。这可以表示为子映射中的多对一

<many-to-one name="Parent" column="Parent_ID" ... />

并且我们必须在父映射中使用该列

<bag name="Children"
       lazy="true" 
       inverse="true" 
       batch-size="25" 
       cascade="all-delete-orphan" >
    // This columns is the same as for many-to-one
    <key column="Parent_ID" />
    <one-to-many class="Child" />
</bag>

点击此处查看所有详细信息:

Minimal and correct way to map one-to-many with NHibernate