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

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


久保(jflute)です

恐らくですが、
EntityにマッピングするときのM_KOUSEIに
対するキーがユニークにならなくて、
マッピングがうまくいってないのかと考えられます。

fixedConditionは、
相手がmanyのときにoneするための絞り込み(業務的one-to-one)、
もしくは、
自分が関連と無関係なmanyを含んでるときに絞り込み(業務的many-to-one)、
に利用されることを想定していますが、
キーは、あくまで localColumnName や foreignColumnName に
定義されたものである必要があります。

なので、本当はこんなイメージなんですよね。(いまできないけど)

     ; FK_T_B_A02 = map:{
         ; localTableName  = T_B            ; foreignTableName  = M_KOUSEI
         ; localColumnName =
PROC_NO/$$over($localTable.TAMeiBySeizoIdSeizoLineId.TABySeizoId)$$.HINMOKU_CD
         ; foreignColumnName = PROC_NO/SEIHIN_HINMOKU_CD
     }

ちょと対応できるかどうかも含めて考えますね


2012/10/26 村上れお <uparrow @ nifty.com>:
> 久保様
>
> uparrowと申します。
>
> こちらの送信サーバの問題かと思い、同様のメールを投稿してしまいました。
> すみません。
>
> 状況は変わっておりません。
>
> おっしゃる通り、発行されるSQLは問題なく、想定するデータを取得する文が
> 発行されているようでした。
>
>> アプリから実行するとEntityのデータがおかしい、って感じでしょうか?
>> また、具体的にEntityがどのようなデータになってしまうのでしょうか?
>> (例えば、T_Bに紐付くM_KOUSEIのデータが別レコードものだったり)
> その通りで、M_KOUSEIのデータの紐づくはずのない別なレコードが
> Entityに設定されておりました。
> Entityに設定される別なレコードの規則性はつかめておりません。
>
> 対応いただけると非常に助かります。
> テスト的に作成した環境もまだありますので、何かご協力できることがあれば
> いたします。
>
> よろしくお願いいたします。
>
>> 久保(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 mailing list
>> seasar-dotnet @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
>
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet


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