2014-09-13 2 views
1

모델은 userLoginSessions (LogginSession은 단 한 명의 사용자와 관련 될 수 있음)을 많이 가질 수 있다는 것입니다.
내가 달성하려고하는 것은 관련 LoginSession (쿼리에서 제공되는 토큰)을 사용자에게 가져 오는 것입니다.쿼리로 Hibernate eager 로딩

LoginSession loginSession = new LoginSession(); 
    loginSession.setToken(sessionToken); 

    //Example loginSessionExample = Example.create(loginSession); 

    Criteria crit = session.createCriteria(User.class); 
    crit.createAlias("userLoginSession", "session"); 
    crit.add(Restrictions.eq("session.token", sessionToken)); 
    crit.setMaxResults(1); 
    crit.setFirstResult(0); 
    crit.setFetchMode("loginSession", FetchMode.JOIN); 

List<?> usersList = (List<?>) crit.list(); // first query 

if(usersList.size() == 1) 
{ 
    User user = (User) usersList.get(0); 
    LoginSession loginSession = (LoginSession) user.getUserLoginSession().toArray()[0]; //second query 
    ... 

문제가 있다는 것입니다 :이 코드가

: 나는 단지 하나 개의 쿼리와 함께 할 노력하고, 나는 열망로드를 사용하려면 그렇게 그 모든 여기 내 코드입니다 실행중인 2 개의 quires가 있습니다 (제공된 코드의 주석 참조).

내가 기준을 잘못 지정하면 어떻게 하나의 검색어가 될 수 있습니까?

감사

답변

1

이 방법 최대 절전 모드 (대부분으로 ORMs)의 작품이다 : 다른 테이블에서 그들이 게으른 부하의 관계는 실제로 필요할 때. 그렇지 않다면 원하는 모든 것이 하나의 객체 일 때 데이터베이스의 상당 부분을로드 할 수 있습니다.

게으름로드는 this StackExchange answer에 설명 된대로 관계별로 관계를 해제 할 수 있습니다. 그러나, 그것은 항상 장애가 있다는 것을 의미하므로, 그렇게하기 전에 이것이 실제로 나쁜 것임을 확인하십시오.

나는 당신이 묘사 한 상황이 나쁜 것이라고 말하지 않을 것입니다.