[seasar-dotnet:450] Relnoを指定したとき、データがなければNULLにする方法

Toru Uetani toru.uetani+seasar @ gmail.com
2007年 2月 22日 (木) 12:10:47 JST


お世話になっております、上谷です。

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 メーリングリストの案内