2012-02-02 2 views
1

Возможно ли выполнить соединение между двумя таблицами, которые не имеют внешних ключей?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

На двух таблицах вы подразумеваете два класса, которые сопоставлены с двумя таблицами правильно? В этом случае вы можете просто использовать класс (скажем, два класса Foo & Bar, которые отображаются на некоторые таблицы) следующим образом:

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[]>(); 

Надежда это то, что вы хотите.

+0

спасибо за ваш ответ, я попытался использовать ваш совет, но я не смог понять синтаксис. Я отредактировал свое оригинальное сообщение, не возражаете ли вы переписать свой пример кода? – iKode

Смежные вопросы