2013-04-21 2 views
0

у меня есть три класса говорят A, B и C, как показано ниже:Как предотвратить объединение таблиц в жаждущих отношений при использовании критериев

Класс A имеет OneToOne отношение с B:

Class A { 
    @OneToOne 
    B b; 
} 

И B имеет нетерпеливое отношение с C.

Class B { 
    @ManyToOne(fetch=fetchType.EAGER) 
    C c; 
} 

Я хочу иметь критерии (на A) и присоединиться к нему с B, чтобы получить некоторые данные из этих двух таблиц. Но когда я использую createAlias (или любые другие конкретные соединения), то также присоединяется таблица C. (По-видимому, из-за нетерпеливого отношения между B и C). Что-то вроде этого:

Criteria aCrit = session.createCriteria(A.class, "a"); 
aCrit.createAlias("a.b", "b"); 
aCrit.setProjection(Projections.property("b.name"); 
aCrit.list(); 

Вопрос заключается в том, что у меня нет необходимости C, я не хочу, чтобы присоединиться. Как я могу вручную предотвратить такое действие?

ответ

0

Вы должны быть в состоянии определить режим выборки динамически только для запроса:

Criteria aCrit = session.createCriteria(A.class, "a"); 
aCrit.createAlias("a.b", "b"); 
aCrit.setFetchMode("b.c", FetchMode.SELECT) 
aCrit.setProjection(Projections.property("b.name"); 
aCrit.list(); 
+0

Спасибо. Я попробую и дам вам знать результат. Интересно, почему не использовать 'FetchMode.LAZY' сам? –

+0

Константа перечисления 'FetchMode.LAZY' устарела: http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/FetchMode.html – dcernahoschi

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