[seasar-dotnet:1416] Re: 同一テーブルを複数回にわたって結合する

Tatsuya Yakuwa [E-MAIL ADDRESS DELETED]
2009年 8月 1日 (土) 09:11:27 JST


八鍬です。

久保様、ご回答ありがとうございます。

> それができないなら、こちらのFixedConditionの機能を
> 使って実現ができるかもしれません。
> http://d.hatena.ne.jp/jflute/20081201/1228126523
この方法で検証した結果、実装できました。
/*
	; FK_Pre_Member_Info_Com_Code_Gender = map:{
	    ; localTableName  = Pre_Member_Info ; foreignTableName = Com_Code
	    ; localColumnName = gender_cd ; foreignColumnName = code_val
         ; fixedCondition =
     $$foreignAlias$$.codesb_cd = /*CodeSbGender(String)*/Null
     #$$foreignAlias$$.codesb_cd = '0008'
	    ; fixedSuffix = AsValidGender
	}
*/
こんな感じで、仮想外部キーを定義したところ、
うまくいきました。


> ちなみに「DbFluteでは」というより「ConditionBeanでは」ですね。
> (外だしSQLを使えばできるので)
失礼しました。。。


以上です。
ありがとうございました。

On Fri, 31 Jul 2009 16:28:24 +0900, kubo <[E-MAIL ADDRESS DELETED]> wrote:

> 久保です。
>
>> 会員情報照会画面等では、階級の名称を表示するために
>> テーブル区分値(classificationDefinitionMap)を使用することを考えていたのですが、
>> 変更の度に、DLLを差し替える必要があるため、
>> 運用に耐えられないということです。
>
> ありがとうございます。Classification機能自体のの利用有無
> というよりは、名称の表示でClassification機能を利用するかどうか
> という感じですね。(ちょっと自分が勘違いしました)
> もともと、DBFluteのClassification機能は「設定・判定」が
> 主な目的で、名称の表示に関してはマスタテーブルに名称があるなら
> そっちを使うことを想定しています。
> 当然の判断でまったく問題ないと思います。
>
>> のように、Com_CodeのPKは(codesb_cd(コード種別),code_val(コード値))の複合キーになっており、
>> 複数のコードを種別ごとに、コード値と名称などを管理するマスタになっています。
>>
>> 対して、Pre_Member_Info側では、gender_cd(性別),post_cd(階級)のように、
>> コード値に対応するのみのカラムしかありません。
>
> DBを変更する、ってのはやはりもちろんダメですよね。
> 一応、ML上の情報共有のことを考え、形式的ですが...
> できるならば、DBを変更して、
>
> o Pre_Member_Infoにcodesb_cdも保持させて複合FK制約を付与
> o Com_Codeに代理キーを付けて、それ経由でFK制約参照
> o 複数のマスタテーブルを一つのテーブルに押し込めるのではなく、
>  それぞれちゃんとした独立したマスタテーブルとする
>  (ExampleDBの会員ステータステーブルみたいな感じ)
>
> をお奨めします。単に名称取得ってだけでなく多くの他の面でも
> DBを直した方がメリットが大きいからです。
>
> で、それができないなら、こちらのFixedConditionの機能を
> 使って実現ができるかもしれません。
> http://d.hatena.ne.jp/jflute/20081201/1228126523
> 「codesb_cd = '0008'」の部分をまさしくfixedConditionとして、
> DBFlute上で一つ一つのカラム毎に関連を付与します。
> そもそも目的が違う機能なので、ちょっとやってみないと
> わからないって感じですが、ぜひお試し下さい。
>
>> DbFluteでは、先述のON句のように定数を渡して結合のようなことを
>> 実装する手段は、ありますでしょうか??
> ちなみに「DbFluteでは」というより「ConditionBeanでは」ですね。
> (外だしSQLを使えばできるので)
>
> 2009/7/31 Tatsuya Yakuwa <[E-MAIL ADDRESS DELETED]>:
>> 久保様、ご回答ありがとうございます。
>>
>> 同一テーブルを複数回という点に関しては、
>> 外部キーを複数作成することで理解いたしました。
>>
>>
>>> 具体的にどういった要件だったのか教えて頂けますでしょうか?
>>> ぜひ参考にしたいと思いますので、差し支えの無い範囲でいいので。
>>
>> 例えば、会員の階級を表すコードで、
>> 運用後に追加変更できるようにしたい場合です。
>>
>> 会員情報照会画面等では、階級の名称を表示するために
>> テーブル区分値(classificationDefinitionMap)を使用することを考えていたのですが、
>> 変更の度に、DLLを差し替える必要があるため、
>> 運用に耐えられないということです。
>>
>>
>>
>> ここからは、おって確認なのですが。
>> テーブル構造そのものに関わってしまうようであれなのですが、
>>
>> /*
>> FROM Pre_Member_Info M
>>   left outer join dbo.Com_Code C1
>>   on (C1.codesb_cd = '0008'
>>                 and C1.code_val = gender_cd)
>>   left outer join dbo.Com_Code C2
>>   on (C2.codesb_cd='0026'
>>                 and C2.code_val = post_cd )
>> */
>> のように、Com_CodeのPKは(codesb_cd(コード種別),code_val(コード値))の複合キーになっており、
>> 複数のコードを種別ごとに、コード値と名称などを管理するマスタになっています。
>>
>> 対して、Pre_Member_Info側では、gender_cd(性別),post_cd(階級)のように、
>> コード値に対応するのみのカラムしかありません。
>>
>> この場合、外部キーを定義するには、Pre_Member_Info側にコード種別に対応するカラムを、
>> コード毎に追加する必要がでてきます。
>> (もしくは、複合でない一意のキーになる共通のカラムを追加する)
>> 例えば、
>> /*
>> CREATE TABLE [dbo].[Pre_Member_Info](
>>        [ID] [int] IDENTITY(1,1) NOT NULL,
>>        [member_No] [nchar](10) NULL,
>>        [birth_dt] [datetime] NULL,
>>        [gender_sb] [nchar](10) NULL,
>>        [gender_cd] [nchar](10) NULL,
>>        [post_sb] [nchar](10) NULL,
>>        [post_cd] [nchar](10) NULL,
>> */
>> 現状は、これで対応しているのですが。。。
>>
>> DbFluteでは、先述のON句のように定数を渡して結合のようなことを
>> 実装する手段は、ありますでしょうか??
>>
>>
>> 以上です。
>> よろしくお願いします。
>>
>>
>> On Thu, 30 Jul 2009 21:24:35 +0900, kubo <[E-MAIL ADDRESS DELETED]> wrote:
>>
>>> 久保(jflute)です。
>>>
>>> 八鍬さん、こんばんは
>>>
>>>> 一つのテーブルに対して、同一テーブルを複数回にわたって
>>>
>>> こちらの意味の確認ですが、
>>> 例えば、
>>> 「会員」テーブルと「会員ステータス」テーブルがあったとして、
>>> 「会員」テーブルに「現在会員ステータスコード」と
>>> 「前回会員ステータスコード」というカラムがあって、
>>> それぞれのコード経由で「会員ステータス」を取得したい
>>> ということでよろしいでしょうか?
>>> (一つのテーブルから同じテーブルに対して複数のFKがある)
>>>
>>> MemberCB cb = new MemberCB();
>>> cb.setupSelect_MemberStatusBy現在();
>>> cb.setupSelect_MemberStatusBy前回();
>>> ...
>>>
>>> Member member = memberBhv.selectEntity(cb);
>>> ... = member.getMemberStatusBy現在();
>>> ... = member.getMemberStatusBy前回();
>>>
>>> この場合FK制約が貼られていれば、上記の例のように
>>> 「テーブル名Byカラム名」という識別子でそれぞれの
>>> リレーション毎にメソッドが作成され、それぞれ別個に
>>> 扱うことができます。
>>>
>>> なので、FK制約が貼られていればそういったメソッドが
>>> 生成されているはずです。
>>>
>>>> classificationDefinitionMapを使用することも検討したのですが、
>>>> エンドユーザが保守できる要件をみたせなくなってしまうため、
>>>> 見送った経緯があります。
>>>
>>> 具体的にどういった要件だったのか教えて頂けますでしょうか?
>>> ぜひ参考にしたいと思いますので、差し支えの無い範囲でいいので。
>>>
>>> 2009/7/30 Tatsuya Yakuwa <[E-MAIL ADDRESS DELETED]>:
>>>>
>>>> お世話になっております。
>>>> 八鍬(やくわ)と申します。
>>>>
>>>> DbFluteのConditionBeanについて、おたずねしたいのですが。。。
>>>>
>>>> 外出しSQLを使用せず、ConditionBeanで
>>>> 1つのテーブルに対して、同一テーブルを複数回にわたって
>>>> 、結合することは可能でしょうか?
>>>>
>>>> 例えば、名称マスタや区分マスタなどのコード→名称のようなテーブルから、
>>>> 名称を取得するようなケースです。
>>>>
>>>> http://dbflute.sandbox.seasar.org/contents/condition-bean/basic.html
>>>> のDBFluteBasicExampleを参考にしていたのですが、
>>>> 同じようなケースが見当たらなかったので。。。
>>>>
>>>>
>>>> --
>>>> /*
>>>> SELECT M.kojinID
>>>> ,M.member_no
>>>> ,M.section_cd
>>>> ,M.gender_cd
>>>>  ,C1.code_nm as gender_nm
>>>> ,M.post_cd
>>>>  ,C2.code_nm as post_nm
>>>>  FROM Pre_Member_Info M
>>>>  left outer join dbo.Com_Code C1
>>>>  on (C1.codesb_cd = '0008'
>>>>                and C1.code_val = gender_cd)
>>>>  left outer join dbo.Com_Code C2
>>>>  on (C2.code_val = post_cd
>>>>                and C2.codesb_cd='0026' )
>>>> */
>>>> もしくは
>>>> --
>>>> /*
>>>> SELECT kojinID
>>>> ,member_no
>>>> ,section_cd
>>>>  ,(select code_nm
>>>>      from dbo.Com_Code
>>>>      where codesb_cd='0008'
>>>>      and code_val = gender_cd ) as gender_nm
>>>>  ,(select code_nm
>>>>      from dbo.Com_Code
>>>>      where codesb_cd='0026'
>>>>      and code_val = post_cd ) as post_nm
>>>>
>>>>  FROM Pre_Member_Info
>>>>
>>>> */
>>>>
>>>> のようなSQLです。
>>>>
>>>> ちなみに、
>>>> classificationDefinitionMapを使用することも検討したのですが、
>>>> エンドユーザが保守できる要件をみたせなくなってしまうため、
>>>> 見送った経緯があります。
>>>>
>>>>
>>>> 以上よろしくお願いいたします。
>>>> --
>>>> *----**===**----**===**----**===**----**===**----*
>>>>  株式会社 エム・エス・アイ
>>>>  システム部 八鍬 達也
>>>>  Add:山形市松栄1-5-7
>>>>  Tel:023-647-3966 Fax:023-647-3967
>>>>  E-mail:[E-MAIL ADDRESS DELETED]
>>>>  ☆ ★ ☆    社員ブログ更新中!!!    ☆ ★ ☆
>>>>  http://www.msi-net.co.jp/blog/index.html
>>>> *----**===**----**===**----**===**----**===**----*
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>> __________ Information from ESET NOD32 Antivirus, version of virus
>>> signature database 4292 (20090730) __________
>>>
>>> The message was checked by ESET NOD32 Antivirus.
>>>
>>> http://www.eset.com
>>>
>>>
>>>

>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
> __________ Information from ESET NOD32 Antivirus, version of virus  
> signature database 4292 (20090730) __________
>
> The message was checked by ESET NOD32 Antivirus.
>
> http://www.eset.com
>
>
>

-- 
八鍬 達也


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