2012-02-02 21 views
1

外部キーを持たない2つのテーブル間で結合を行うことはできますか?テーブルに外部キーを持たないHQL結合

編集:いいえ、私はこれが可能であると確信していましたが、まだそれをどうやって行うのか完全にはわかりません。

クラス

public class Booking 
{ 
    public virtual int Id { get; set; } 
    public virtual Int32 bookingID { get; set; } 
    public virtual Int32 bookingAdminID { get; set; 
} 

public class BookingLocation 
{ 
    public virtual int Id { get; set; } 
    public virtual Int32 bookingID { get; set; } 
    public virtual Int32 locationID { get; set; } 
} 

マッピング

public BookingMap() 
{ 
    Table("Bookings"); 

    Id(x => x.Id).Column("ID"); 
    Map(x => x.bookingID).Column("BookingID"); 
    Map(x => x.bookingAdminID).Column("BookingAdminID"); 
} 

public class BookingLocation 
{ 
    public virtual int Id { get; set; } 
    public virtual Int32 bookingID { get; set; } 
    public virtual Int32 locationID { get; set; } 
} 

私は、内側が上記の両方のテーブルのbookingIDに参加し、簡単な操作を行う必要があります。どうすればいい?

私が試してみました:

var hql = "select b from Booking as b inner join BookingLocation as bl on b.bookingID = bl.bookingID"; 
var bookings = session.CreateQuery(hql).List<object[]>(); 

をしかし、私はエラーを取得:

Semantic exception was unhandled by user code Path expected for join!

[select b from Booking as b inner join BookingLocation as bl on b.bookingID = bl.bookingID]

私は簡単にマッピングにおけるこれら2つのテーブル間の関係を構築することはできませんので、私はこのアプローチを取っています。あなたは結合をするために関係を持っている必要がありますか?

答えて

0

私はそうのような私のエンティティに関係を追加することによってこの問題を解決することができた:

public class Booking 
{ 
    public virtual int Id { get; set; } 
    public virtual Int32 bookingID { get; set; } 
    public virtual Int32 bookingAdminID { get; set; } 


    public virtual IList<BookingLocation> BookingLocations { get; set; } 

    public Booking() 
    { 
     BookingLocations = new List<BookingLocation>(); 
    } 
} 

public class BookingLocation 
{ 
    public virtual int Id { get; set; } 
    public virtual Int32 bookingID { get; set; } 
    public virtual Int32 locationID { get; set; } 
    public virtual Booking Booking { get; set; } 
} 

彼らは外部キーを持っていないにもかかわらず、私はこのように参加行うことができました:

var bookings = session.CreateCriteria<Booking>("p") 
           .CreateCriteria("p.BookingLocations", JoinType.InnerJoin) 
           .SetMaxResults(30) 
           .List<Booking>(); 
3

2つのテーブルでは、2つのテーブルにマップされる2つのクラスが正しいことを意味しますか?これはあなたが望むものである

session.CreateQuery("select * from A as a, B as b 
where a.Prop1=:value1 and b.Prop2=:value2" //conditions if any) 
.SetString("value1",val1) 
.SetString("value2",val2) 
.List<object[]>(); 

希望:その場合は、あなただけのクラスを使用することができ、以下のように(例えば2つのクラスがいくつかのテーブルにマップされ&バーをFOO)。

+0

あなたの答えをありがとう、私はあなたのアドバイスを使用しようとしましたが、私は構文を把握することができませんでした。オリジナルの投稿を編集しました。サンプルコードを書き直してもよろしいですか? – iKode

関連する問題