是否可以在通过自定义SQL查询填充集合的实体上拥有只读集合?
我有3个班级 - Village
,Report
和Army
- 每个班级都有一个表格支持。我希望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
答案 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>
点击此处查看所有详细信息: