문제

다음 Bean 작업, ServerDetails 및 ApplicationDetails가 있습니다. 특정 응용 프로그램 이름을 기반으로 모든 작업, 서버 세부 정보 및 응용 프로그램 세부 정보를 검색하고 싶습니다.

결과에서 : task.getServers (). getApplicationDetails ()와 같은 방식으로 데이터를 검색 할 수있을 것으로 기대합니다.

실제로, 나는 객체로서 평평한 데이터의 표현으로 보이는 것을 얻습니다 [].

내가 제안한 일을 할 수있는 방법이 있습니까?

다음은 내 코드입니다 ...

class Task {
    private String taskId;
    private Set<ServerDetails> servers;
}

class ServerDetails {
    private String id;
    private Set<ApplicationDetails> applications;
}

class ApplicationDetails {
   private String id;
}

HQL :

StringBuilder hql = new StringBuilder(256);
hql.append("FROM Task h, ServerDetails ser, ApplicationDetails app ");
hql.append("WHERE h.executionDate > "); 
hql.append("to_date('");
hql.append(DBDateFormatter.getInstance().formatDate(cal));
hql.append("',  '");
hql.append(DBDateFormatter.getInstance().getOracleDateFormat());
hql.append("') and h.id = ser.task.id and ser.id = app.server and app.name = 'XXX'");
hql.append(" order by h.executionDate desc");
String hql = hql.toString();

Query query = session.createQuery(hql);      
results = (List<Object[]>) query.list();
도움이 되었습니까?

해결책

메인 객체를 검색해야합니다.

다른 한편으로는 다음과 같습니다.

  1. 그 동안 그들에게 탐색하십시오 Session 닫히지 않았습니다 (Lazy라고 알려진 필요에 따라 추가 쿼리를 실행합니다. 사용 편의성에 이상적입니다).
  2. 원래 쿼리에서 검색합니다 fetch 예어.

예시:

    SELECT h 
    FROM Task h
    JOIN FETCH h.serveurs ser
    JOIN FETCH ser.applications app 
    WHERE h.executionDate > 
    .... // no need to specify the joins

다음과 같은 방식으로 데이터를 검색 할 수 있습니다.
task.getServers().getApplicationDetails()

다른 팁

다른 사람들이 Left Join Fech를 사용하여 말한 것처럼 객체 그래프를 검색 할 수 있습니다. 객체 그래프를 검색 할 때 찾은 한 번의 Crevent, 다중 관계를 걸어 갈 때 추가 데이터베이스 액세스없이 뒤로 물러날 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top