[seasar-dotnet:2207] Re: [DBFlute.NET]業務的one-to-oneの設定(別リレーションのカラム利用)
村上れお
[E-MAIL ADDRESS DELETED]
2012年 10月 26日 (金) 01:32:42 JST
久保様
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 メーリングリストの案内