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