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

kubo [E-MAIL ADDRESS DELETED]
2012年 10月 26日 (金) 01:26:11 JST


久保(jflute)です

uparrowさん、こんばんは
まずはすいません。SeasarのMLの不具合で、
こちらのメールを受信しのがつい先ほどでして。
既に何か進展あったかもしれませんが取り急ぎ。

設定の方、ぱっと見まちがったところはないように思えます。
発行されるSQLをDBツールで実行すると想定する値になるけど、
アプリから実行するとEntityのデータがおかしい、って感じでしょうか?
また、具体的にEntityがどのようなデータになってしまうのでしょうか?
(例えば、T_Bに紐付くM_KOUSEIのデータが別レコードものだったり)

2012/10/15  <uparrow @ nifty.com>:
> 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 mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet


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