[seasar-dotnet:2201] [DBFlute.NET]業務的one-to-oneの設定(別リレーションのカラム利用)

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2012年 10月 15日 (月) 17:53:06 JST


uparrowと申します。

業務的one-to-oneを使おうと思っていますが、思ったデータが取得できずに困っています。

親の親の項目&自分の項目 と 別な親の2つの項目を
条件としてテーブルを結合させる必要があり、業務的one-to-oneの別リレーションのカラム利用
する方法でadditionalForeignKeyMapのプロパティに設定しました。

実際にデータの取得を試みると、発行されるSQLは想定通りなのですが
DBFluteのエンティティに設定される値が想定と異なるのです。
(結合条件に使用しているキーなのに、それぞれのテーブルのエンティティの項
目値がことなる。)

設定や、使用方法に誤りがあるのでしょうか?
アドバイスを頂戴できると助かります。

[テーブル]
親 T_A
子 T_A_MEI

親 T_A_MEI
子 T_B

親 M_KOUSEI
子 T_B   ←自分のテーブル

親の親(T_A)のHINMOKU_CD & 自分(T_B)のPROC_NO
別な親(M_KOUSEI)のSEIHIN_HINMOKU_CD & PROC_NO
をキーとして結合したい。
クエリ発行後のM_KOUSEIのエンティティが想定の値と異なる。

[テーブルDDL]
具体的なテーブルは以下となります。
CREATE TABLE T_A
(
    SEIZO_ID                       DECIMAL(12,0) NOT NULL,
    HINMOKU_CD                     VARCHAR(30) NULL,
)
go
ALTER TABLE T_A
    ADD CONSTRAINT PK_T_A PRIMARY KEY  (SEIZO_ID)
go

CREATE TABLE T_A_MEI
(
    SEIZO_ID                       DECIMAL(12,0) NOT NULL,
    LINE_ID                        DECIMAL(12,0) NOT NULL,
)
go
ALTER TABLE T_A_MEI
    ADD PRIMARY KEY  (SEIZO_ID, LINE_ID)
go

CREATE TABLE T_B
(
    SHIJI_ID                       DECIMAL(12,0) NOT NULL,
    SEIZO_ID                       DECIMAL(12,0) NULL,
    SEIZO_LINE_ID                  DECIMAL(12,0) NULL,
    PROC_NO                        VARCHAR(20) NULL,
)
go
ALTER TABLE T_B
    ADD CONSTRAINT PK_T_B PRIMARY KEY  (SHIJI_ID)
go

CREATE TABLE M_KOUSEI
(
    SEIHIN_HINMOKU_CD              VARCHAR(30) NOT NULL,
    PROC_NO                        VARCHAR(20) NOT NULL,
    BUHIN_NO                       VARCHAR(20) NOT NULL,
    KANAGATA_CD                    VARCHAR(20) NULL
)
go
ALTER TABLE M_KOUSEI
    ADD CONSTRAINT PK_M_KOUSEI PRIMARY KEY  (SEIHIN_HINMOKU_CD, PROC_NO)
go


[additionalForeignKeyMap]
    ; FK_T_A_MEI_01 = map:{
        ; localTableName  = T_A_MEI         ; foreignTableName  = T_A
        ; localColumnName = SEIZO_ID            ; foreignColumnName = SEIZO_ID
        ; fixedSuffix = BySeizoId
    }
    ; FK_T_B_02 = map:{
        ; localTableName  = T_B                 ; foreignTableName  = T_A_MEI
        ; localColumnName = SEIZO_ID/SEIZO_LINE_ID  ; foreignColumnName = SEIZO_ID/LINE_ID
        ; fixedSuffix = BySeizoIdSeizoLineId
    }
    ; FK_T_B_A02 = map:{
        ; localTableName  = T_B            ; foreignTableName  = M_KOUSEI
        ; localColumnName = PROC_NO            ; foreignColumnName = PROC_NO
        ; fixedCondition =
                  $$over($localTable.TAMeiBySeizoIdSeizoLineId.TABySeizoId)$$.HINMOKU_CD = $$foreignAlias$$.SEIHIN_HINMOKU_CD
        ; fixedSuffix = AsKousei
    }

[データ取得ソース]
        [Test, Quill(Tx.Rollback)]
        public void FindTest()
        {
            TBCB cb = new TBCB();
            cb.SetupSelect_TAMeiBySeizoIdSeizoLineId().WithTABySeizoId();
            cb.SetupSelect_MKouseiAsKousei();

            cb.Query().AddOrderBy_ShijiId_Asc();

            ListResultBean<TB> dbEntityList = tBBhv.SelectList(cb);

            foreach (TB dbEntity in dbEntityList)
            {
                if (dbEntity.TAMeiBySeizoIdSeizoLineId.TABySeizoId.HinmokuCd != dbEntity.MKouseiAsKousei.SeihinHinmokuCd ||
                    dbEntity.ProcNo != dbEntity.MKouseiAsKousei.ProcNo)
                {
                    Assert.Fail();
                }
            }
        }

[発行されるSQL]
select  dfloc.SHIJI_ID as c0, dfloc.SEIZO_ID as c1, dfloc.SEIZO_LINE_ID as c2, dfloc.PROC_NO as c3
     , dfrel_0.SEIZO_ID as c4, dfrel_0.LINE_ID as c5
     , dfrel_0_0.SEIZO_ID as c6, dfrel_0_0.HINMOKU_CD as c7
     , dfrel_1.SEIHIN_HINMOKU_CD as c8, dfrel_1.PROC_NO as c9, dfrel_1.BUHIN_NO as c10, dfrel_1.KANAGATA_CD as c11 
  from T_B dfloc
    left outer join T_A_MEI dfrel_0 on dfloc.SEIZO_ID = dfrel_0.SEIZO_ID and dfloc.SEIZO_LINE_ID = dfrel_0.LINE_ID
    left outer join T_A dfrel_0_0 on dfrel_0.SEIZO_ID = dfrel_0_0.SEIZO_ID
    left outer join M_KOUSEI dfrel_1
      on dfloc.PROC_NO = dfrel_1.PROC_NO
     and dfrel_0_0.HINMOKU_CD = dfrel_1.SEIHIN_HINMOKU_CD  
 order by dfloc.SHIJI_ID asc

( dfrel_0_0.HINMOKU_CD,dfloc.PROC_NO と dfrel_1.SEIHIN_HINMOKU_CD,dfrel_1.PROC_NO 
 は想定の値が抽出されている。)

バージョン
dbflute-0.8.9.43
データベース
SQL Server 2008

以上、よろしくお願いいたします。




seasar-dotnet メーリングリストの案内