[seasar-dotnet:451] Re: Relnoを指定したとき、データがなければNULLにする方法
Kazuya Sugimoto
sugimotokazuya @ gmail.com
2007年 2月 22日 (木) 15:40:44 JST
杉本です。
上谷さん、こんにちは。
VoucherStatusテーブルのプライマリキーが取れない場合はnullになるはずですが、
おかしいですね。
> [VoucherStatusId] [int] IDENTITY(1,1) PRIMARY,
これは、PRIMARY KEYのうつし間違いですよね?
07/02/22 に Toru Uetani さんは書きました:
> お世話になっております、上谷です。
>
> Relnoの動作について、質問させてください。
>
> VoucherテーブルとVoucherStatusテーブルがあり、それぞれにエンティティクラスを作成しました。
> さらにVoucherDtoクラス(Voucherクラスを継承)を作成して、VoucherStatusクラスをStatusプロパティに持つようにしました。
> このプロパティにRelno属性がついています。
>
> 基本的にVoucherテーブルとVoucherStatusテーブルは1:1ですが、
> VoucherテーブルにデータがあってもVoucherStatusテーブルにデータがない状態があります。
> 逆はありません。
> つまり、VoucherDtoを取得したとき、StatusプロパティはNULLの可能性があります。
> ですが、VoucherStatusテーブルにデータがなくてもStatusプロパティがNULLになりません。
> 例)Voucherテーブルに1件データがあり、VoucherStatusテーブルにデータがない場合
> VoucherDto.VoucherId -> 1
> VoucherDto.VoucherNumber -> 'IN-001'
> VoucherDto.Status.VoucherStatusId -> 0
> VoucherDto.Status.VoucherId -> 1
>
> VoucherStatusテーブルにデータがない場合に、StatusプロパティをNULLにするにはどうすればいいのでしょうか?
>
>
> 長くなりますが、以下ソースです。
>
> 環境:
> WinXPsp2 VS2005 SqlServer2005 Express
> Seasar.dll -> 1.2.8.0
> Seasar.Dao.dll -> 1.0.3.0
>
> Voucherテーブル −−−−−−−−−−−−−−−−−−−−−−−
> CREATE TABLE [Voucher](
> [VoucherId] [int] IDENTITY(1,1) PRIMARY KEY,
> [VoucherNumber] [nchar](10) NOT NULL
> )
> VoucherStatusテーブル −−−−−−−−−−−−−−−−−−−−−−−
> CREATE TABLE [VoucherStatus](
> [VoucherStatusId] [int] IDENTITY(1,1) PRIMARY,
> [VoucherId] [int] NOT NULL
> )
> Voucher.cs −−−−−−−−−−−−−−−−−−−−−−−
> using System;
> using Seasar.Dao.Attrs;
> namespace WindowsApplication1.Entity {
> [Table("Voucher")]
> public partial class Voucher {
> private int _voucherId;
> private string _voucherNumber;
> [ID(IDType.IDENTITY)]
> public int VoucherId {
> get { return _voucherId; }
> set { _voucherId = value; }
> }
> public string VoucherNumber {
> get { return _voucherNumber; }
> set { _voucherNumber = value; }
> }
> }
> }
> VoucherStatus.cs −−−−−−−−−−−−−−−−−−−−−−−
> using System;
> using Seasar.Dao.Attrs;
> namespace WindowsApplication1.Entity {
> [Table("VoucherStatus")]
> public partial class VoucherStatus {
> private int _voucherStatusId;
> private int _voucherId;
> [ID(IDType.IDENTITY)]
> public int VoucherStatusId {
> get { return _voucherStatusId; }
> set { _voucherStatusId = value; }
> }
> public int VoucherId {
> get { return _voucherId; }
> set { _voucherId = value; }
> }
> }
> }
> VoucherDto.cs −−−−−−−−−−−−−−−−−−−−−−−
> using System;
> using Seasar.Dao.Attrs;
> namespace WindowsApplication1.Entity {
> public class VoucherDto : Voucher {
> private VoucherStatus _status;
> [Relno(0),Relkeys("VoucherId:VoucherId")]
> public VoucherStatus Status {
> get { return _status; }
> set { _status = value; }
> }
> }
> }
>
> IVoucherDtoDao.cs −−−−−−−−−−−−−−−−−−−−−−−
> using System;
> using System.Collections.Generic;
> using Seasar.Dao.Attrs;
> using WindowsApplication1.Entity;
> namespace WindowsApplication1.Dao {
> [Bean(typeof(VoucherDto))]
> public interface IVoucherDtoDao {
> VoucherDto[] SelectAll();
> }
> }
>
> Voucherテーブルの内容 −−−−−−−−−−−−−−−−−−−−−−−
> VoucherId VocuherNumber
> 1 IN-001
> 2 IN-002
>
> VoucherStatusテーブル −−−−−−−−−−−−−−−−−−−−−−−
> 空
>
> S2Daoが生成したSQL −−−−−−−−−−−−−−−−−−−−−−−
> SELECT Voucher.VoucherId, Voucher.VoucherNumber,
> Status.VoucherId AS VoucherId_0,
> Status.VoucherStatusId AS VoucherStatusId_0
> FROM Voucher LEFT OUTER JOIN
> VoucherStatus AS Status ON Voucher.VoucherId =
> Status.VoucherId
>
> 上記SQLの実行結果 −−−−−−−−−−−−−−−−−−−−−−−
> 1 IN-001 NULL NULL
> 2 IN-002 NULL NULL
>
> --
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
--
Kazuya Sugimoto
http://d.hatena.ne.jp/sugimotokazuya/
seasar-dotnet メーリングリストの案内