2013-08-08 4 views
0

나는 국가, 주 및 교외 인 3 개의 클래스가 있습니다. 각 국가마다 많은 주들이 있으며 각 주마다 많은 교외 지역이 있습니다.FetchType.Eager를 사용하여 값을 검색하는 방법은 무엇입니까?

내 최대 절전 모드는 4.2.1 최종입니다.

상태의 FetchType이 EAGER로 정의되었지만 각 상태의 교외를 검색 할 수 없다는 것이 문제입니다.

나는 이것을 answer에서도 읽습니다. 언제든지 모든 국가의 광고 교외 지역을 검색하고 싶지는 않습니다. 그래서 나는 가정

교외을 미국

@Entity 
public class States { 
    private long id; 
    private String name; 
    private List<Suburbs> suburbs; 
    ... 

    public States(){ 
    this.suburbs = new ArrayList(); 
    } 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    public List<Suburbs> getSuburbs() { 
    return suburbs; 
    } 
} 
기준을 사용하기보다는
@LazyCollection (LazyCollectionOption.FALSE)

나라

@Entity 
public class Country { 
private List<States> states; 
... 
public Country(){ 
    this.states = new ArrayList(); 
} 

@OneToMany (cascade = CascadeType.ALL) 
public List<States> getStates() { 
    return states; 
} 
    .... 
} 

를 사용하여 가져 오는 전략을 재정의해야

@Entity 
public class Suburbs { 
    private long id; 
    private String name; 
    .... 
} 

코드

Criteria criteria = session.createCriteria(Country.class, "country") 
         .createAlias("country.states", "states"); 
       ProjectionList pl = Projections.projectionList(); 
       pl.add(Projections.property("states.id").as("id")); 
       pl.add(Projections.property("states.name").as("name")); 
       criteria.setProjection(pl); 

       criteria.setResultTransformer(new 
          AliasToBeanResultTransformer(States.class)); 

       criteria.add(Restrictions.eq("country.id", id)); 

       List<States> statesList = new ArrayList(); 
       statesList = (List<States>) criteria.list(); 
       System.out.println(">>>" 
          + statesList.get(0).getSuburbs().size()); 
           >>>>> returns Zero 
+1

나는 AliasToBeanResultTransformer 매우 새로운 오전하지만 난 모든 필드에 대한 투사를 만들어야합니다 들었다 link 전 콩에 넣어지기를 원하지만 내 말을 듣지 마라. 나는 틀린 것일 수도있다. –

+0

@GabrielNetto 그것을 시도했지만 "com.project.States 클래스의 suburbName에 대한 setter를 찾을 수 없습니다." –

답변

0
this에서 영감을

User user = (User) session.createCriteria(User.class) 
      .setFetchMode("permissions", FetchMode.JOIN) 
      .add(Restrictions.idEq(userId)) 
      .uniqueResult(); 
+1

목록을 반환하면 실행 상태에 액세스하려고 시도하는 중 예외가 발생했습니다. " .. 프록시를 초기화 할 수 없습니다 - 세션 없음 "예외 –

+1

criteria.setFetchMode ("states ", FetchMode.SELECT) – J888

+0

이 동일한 오류로 실행되기 전에 시도했습니다. –

관련 문제