HQL соединение без внешних ключей на столе - PullRequest
1 голос
/ 02 февраля 2012

Возможно ли объединение двух таблиц без внешних ключей?

Редактировать: Хорошо, я уверен, что это возможно, но я неполностью уверен, как это сделать.

Классы

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

, но я получаю сообщение об ошибке:

Семантическое исключение не было обработано кодом пользователя. Ожидается путь дляприсоединиться!

[выбрать b из бронирования как b внутреннее присоединение BookingLocation как bl на b.bookingID = bl.bookingID]

Я использую этот подход, потому что могуЛегко построить связь между этими двумя таблицами в отображении.Нужно ли иметь отношения, чтобы сделать объединение?

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

на 2 таблицы вы имеете в виду два класса, которые сопоставлены с 2 таблицами правильно?В этом случае вы можете просто использовать класс (скажем, два класса 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 голосов
/ 03 февраля 2012

Я смог решить эту проблему, добавив отношения к своим сущностям следующим образом:

 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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...