3

誰かが次の状況で使用する適切なマッピングを提案できますか:

親テーブル - AllTransactions

子テーブル - TranCategory1、TranCategory2、TranCategory3、その他 8 つ。

12 個のテーブルすべてが同じ複合キーを共有します。現在、AllTransactions の count は、すべての子テーブルのトランザクションの合計です。子テーブルには、親テーブルからの一意の値のみが含まれます。

私が使用しているマッピングを以下に示します。

親テーブルの Select ステートメントで結合を形成しないようにするためだけに、親テーブルで Constrained="true" を使用しています。しかし、AllTransactions のすべてのトランザクションに対して TranCategory1 にトランザクションが存在する必要があるという「制約付き」という言葉の定義に反していると思います。しかし、実際には、私の設計ではその逆が当てはまります。では、マッピングを変更して正しい動作を複製し、結合を使用しないようにするにはどうすればよいでしょうか?

更新: 親と子のテーブルを結合しているときに、現在のマッピングでエラーがスローされます。lease は、上記のテーブルで結合を実行できるようにマッピングを変更するのに役立ちます。

完全なマッピング

Parent Table Mapping

<composite-id name="Key" class="AccountEventKey">
  <key-property name="TransactionId" column="TRANSACTION_ID" type="long"/>
  <key-property name="PartitionMonthNum" column="PARTITION_MONTH_NUM" type ="int"/>
</composite-id>

<many-to-one name="RefAuditQueue" class="RefAuditQueue">
  <column name="AUDIT_QUEUE_ID" not-null ="true"/>
</many-to-one>

<many-to-one name="RefAuditRule" class="RefAuditRules">
  <column name="AUDIT_RULE_ID" not-null ="false"/>
</many-to-one>

<many-to-one name="AccountDailyInfo" class="AccountDailyInfo">
  <column name="ACCOUNT_ID" length="19" not-null ="false"/>
  <column name="ACCOUNT_INFO_PROCESSING_DATE" not-null="false"/>
</many-to-one>

<one-to-one name="DisclosureGroupChange" class="DisclosureGroupChanges" constrained="true"/>

<bag name="AuditReviewAssignmentList" table="AUDIT_REVIEW_ASSIGNMENT" generic="true" inverse="true" cascade="save-update" lazy="true" >
  <key>
    <column name="TRANSACTION_ID" sql-type="long" not-null ="true"/>
    <column name="PARTITION_MONTH_NUM" sql-type="int" not-null ="true"/>
  </key>
  <one-to-many class="AuditReviewAssignment"/>
</bag>

<property name="RacfId" type="string" not-null="false">
  <column name="RACFID" length="7"/>
</property>

<property name="EmployeeDailyAssignmentKey" type="long" not-null="false">
  <column name="EMP_DAILY_ASSIGNMENT_KEY"/>
</property>

<property name="AuditReviewRequiredInd" type="YesNo" not-null="false">
  <column name="AUDIT_REVIEW_REQUIRED_IND"/>
</property>

<property name="TransactionAmount" type="long" not-null="false">
  <column name="TRANSACTION_AMOUNT"/>
</property>

<property name="TransactionDate" type="Timestamp" not-null="false">
  <column name="TRANSACTION_DATE"/>
</property>

<property name="LastModifiedDate" type="Date" not-null="false">
  <column name="LAST_MODIFIED_DATE"/>
</property>

<property name="FirstAddedDate" type="Date" not-null="false">
  <column name="FIRST_ADDED_DATE"/>
</property>

<property name="AccountReferenceNum" type="string" not-null="false">
  <column name="ACCOUNT_REFERENCE_NUM" length="50"/>
</property>

<property name="CcaEtlRunNum" type="long" not-null="true">
  <column name="CCA_ETL_RUN_NUM"/>
</property>

1 Child Table Mapping (There are 10 more child tables)

<composite-id name="Key" class="AccountEventKey">
  <key-property name="TransactionId" column="TRANSACTION_ID" type="long"/>
  <key-property name="PartitionMonthNum" column="PARTITION_MONTH_NUM" type ="int"/>
</composite-id>

<many-to-one name="AccountEvent" class="AccountEvent" insert="false" update="false" unique="true">
  <column name="TRANSACTION_ID"/>
  <column name="PARTITION_MONTH_NUM"/>
</many-to-one>    

<property name="FrDisclosureGrpName" type="string" not-null="false">
  <column name="FR_DISCLOSURE_GRP_NAME" length="8"/>
</property>

<property name="ToDisclosureGrpName" type="string" not-null="false">
  <column name="TO_DISCLOSURE_GRP_NAME" length="8"/>
</property>

<property name="LastModifiedDate" type="Date" not-null="false">
  <column name="LAST_MODIFIED_DATE=" />
</property>

<property name="FirstAddedDate" type="Date" not-null="false">
  <column name="FIRST_ADDED_DATE" />
</property>

<property name="CcaEtlRunNum" type="long" not-null="true">
  <column name="CCA_ETL_RUN_NUM" />
</property>

結合クエリがエラーになる

var query1 = _ses.CreateCriteria<AccountEvent>().CreateAlias("DisclosureGroupChange", "discGrp", NHibernate.SqlCommand.JoinType.InnerJoin).List<AccountEvent>()

例外メッセージは次のとおりです。

"ORA-00923: FROM キーワードが予期された場所に見つかりません\n"

例外メッセージに表示される SQL ステートメント

SELECT this_.TRANSACTION_ID as TRANSACT1_15_1_, this_.PARTITION_MONTH_NUM as PARTITION2_15_1_, this_.AUDIT_QUEUE_ID as AUDIT3_15_1_, this_.AUDIT_RULE_ID as AUDIT4_15_1_, this_.ACCOUNT_ID as ACCOUNT5_15_1_, this_.ACCOUNT_INFO_PROCESSING_DATE as ACCOUNT6_15_1_, this_.RACFID as RACFID15_1_, this_.EMP_DAILY_ASSIGNMENT_KEY as EMP8_15_1_, this_.AUDIT_REVIEW_REQUIRED_IND as AUDIT9_15_1_, this_.TRANSACTION_AMOUNT as TRANSAC10_15_1_, this_.TRANSACTION_DATE as TRANSAC11_15_1_, this_.LAST_MODIFIED_DATE as LAST12_15_1_, this_.FIRST_ADDED_DATE as FIRST13_15_1_, this_.ACCOUNT_REFERENCE_NUM as ACCOUNT14_15_1_, this_.CCA_ETL_RUN_NUM as CCA15_15_1_, discgrp1_.TRANSACTION_ID as TRANSACT1_52_0_, discgrp1_.PARTITION_MONTH_NUM as PARTITION2_52_0_, discgrp1_.FR_DISCLOSURE_GRP_NAME as FR3_52_0_, discgrp1_.TO_DISCLOSURE_GRP_NAME as TO4_52_0_, discgrp1_.LAST_MODIFIED_DATE= as LAST5_52_0_, discgrp1_.FIRST_ADDED_DATE as FIRST6_52_0_, discgrp1_.CCA_ETL_RUN_NUM as CCA7_52_0_ FROM CCAPRD1O_AT.ACCOUNT_EVENT this_ inner join CCAPRD1O_AT.DISCLOSURE_GROUP_CHANGES discgrp1_ on this_.TRANSACTION_ID=discgrp1_.TRANSACTION_ID and this_.PARTITION_MONTH_NUM=discgrp1_.PARTITION_MONTH_NUM

AccountEvent テーブルに DisclosureGroupChanges のマッピングを追加した場合にのみ、このメッセージが表示されることを確認できます。エラーが発生していたため、最初にこのマッピングを回避しました。しかし、これらのテーブル間で結合を実行する必要があります。私の知る限り、NHibernate では関連するテーブルに対してのみ結合を実行できます。ここで間違っている場合は修正してください。

4

1 に答える 1

1

私は自分が犯していた間違いを犯しました。

子テーブルのマッピングの1つに、「LAST_MODIFIED_DATE=」という値がありました。これは私にいつもエラーを引き起こしていました。

于 2011-04-07T05:33:35.670 に答える