2012-07-05 2 views
0

Допустим, что класс «X» сопоставляется с таблицей «X». Класс «A» сопоставляется с таблицей «A», а «B» сопоставляется с таблицей «B».Критерий запроса на спящий режим для сопоставлений с наследованием

Таблица Х Структура: (X_ID, некоторые другие столбцы Таблица A Структура: (A_ID, X_Id, некоторые другие столбцы) Таблица B Структура: (A_ID, некоторые другие столбцы) ... Таблица B также имеет A_ID

Class 'B' расширяет класс 'а' у нас есть отображение файлов для обоих из них, как:.

класса 'A' Parent Mapping файла:

@Entity 
@Table(name = 'A') 
@Inheritance(stratergy=InheritanceType.Joined) 
public abstract class A { 
@Id @Clumns(name = "A_Id) 
@GeneratedValue 
protected Long aId; 
-- some more A specific fields 
} 

Класс 'B' файл Mapping:

@Entity 
@Table(name= 'B') 
Public class B extends A{ 
---- B specific fields 
} 

Теперь у меня есть SQL-запрос, как показано ниже, что мне нужно писать, используя критерии Hibernate API.

select * from X 
INNER JOIN A 
ON X.id = A.id 
INNER JOIN B 
ON A.id = B.id 
where B.name = 'XYZ' 
    and B.Sex = 'M' 

Я придумал:

Criteria c = session.createCriteria(x.class, "x"); 
        .createAlias("x.a", "a") 
        .createAlias("a.b", "b")   
        .add(Restrictions.eq("b.sex", "M")) 
        .add(Restrictions.eq("b.name", "XYZ")); 

Но, если мы проверяем файл отображения, нет прямой ссылки В в А. Таким образом, спящий режим выбрасывает «B не связано с А» организация.

Есть ли способ это наследование может быть отображен в crteria запроса

ответ

1

Вы не должны ссылаться A на все ваши критерии, или использовать псевдонимы.

Criteria c = session.createCriteria(B.class); 
        .add(Restrictions.eq("sex", "M")) 
        .add(Restrictions.eq("name", "XYZ")); 

даст вам нужный вам результат.

Из-за InheritanceType.Joined это, вероятно, приведет к SQL, который включает в себя соединение с таблицей A (что-то близко к отображаемому вами sql), но нет необходимости указывать это соединение в критериях.

Вещи, которые выглядят как столбцы в критериях, являются фактически (отражающими) ссылками на поля в ваших объектах Java. Hibernate вычисляет столбцы для ввода sql из ваших аннотаций и должен присоединиться к таблице A, если это необходимо на основе аннотации наследования.

Чтобы это было в вашем контексте, и чтобы понять все это немного лучше, я бы посоветовал попробовать его и включил ведение журнала сгенерированного sql, как описано в this answer, на другой вопрос о спящем режиме.

+0

Спасибо за ответ ... Но, если я не укажу «А» в критериях. как бы были куплены столбцы, которые мне нужны из «А»? – user1502377

+0

См. Мое обновление для более подробного объяснения этого вопроса. –

+0

позволяет сказать, что у нас есть другая таблица X, которая соединена с «A», а A имеет функциональность подкласса с «B». Тогда моими критериями станут: Критерии c = session.createCriteria (X.класс, «х»); .createAlias ​​("xa", "a") .createAlias ​​("ab", "b") .add (Restrictions.eq ("b.sex", "M")) .add (Restrictions.eq («b.name», «X» «« XYZ »)); Тогда как я могу обойти« A »здесь, поскольку X связан только с« A », но не« B » – user1502377

0

Попробуйте этот способ: Критерии rootCrit = session.createCriteria (A.class); rootCrit.createAlias ​​(«B», «B»); rootCrit.add (Restrictions.eq ("B.sex", "M")); rootCrit.add (Restrictions.eq ("B.name", "XYZ"));

+0

Привет, tarun, я просто изменил вопрос. другое соединение между таблицей x и a и неспособность правильно получить критерии запроса? – user1502377

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