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