2012-10-15 2 views
1

의 가장 최근의 날짜 필드가 나는 상태의 컬렉션 연구소가 여기 내 간단 클래스입니다. MYSQL이 잘 작동 :최대 절전 모드 기준 컬렉션

SELECT ls.* FROM labs_states les INNER JOIN 
    (SELECT idLab, idLabState, MAX(date) AS lastDate FROM labs_states GROUP BY idLab) 
     groupedLabs ON les.idLab = groupedLabs.idLab AND les.date = groupedLabs.lastDate 

편집 : 탐색 방법 :

public List<Labs> search(LabSearch labSearch) { 

      SessionFactory sessionFactory = hibernateTemplate.getSessionFactory(); 
      Session session = sessionFactory.openSession(); 

      Criteria criteria = session.createCriteria(Lab.class); 

      criteria.add(Restrictions.like("name", "%" + labSearch.getName() + "%")); 

      if(labSearch.getState() != null){ 
       criteria.createCriteria("states").add(Restrictions.eq("state", labSearch.getState())).addOrder(Order.asc("date")).list().get(0); 


      return (List<Lab>) criteria.list(); 
} 

나는 기준이 작업을 수행하기 위해, 또는있을 경우 다른 방법은 어떻게 nkow하지 않는

감사

답변

1

는 주어진 실험실의 마지막 상태를 얻을 수

Criteria criteria = session.createCriteria(Lab.class) 
    .add(Restrictions.like("name", "%" + labSearch.getName() + "%")); 
    .createAlias("states", "labstate") 
    .createAlias("labstate", "state") 
    .addOrder(Order.desc("date")) 
    .setProjection(Projections.list() 
     .add(Projections.property("labstate.id"), "id") 
     .add(Projections.property("labstate.date"), "date") 
     .add(Projections.property("labstate.comments"), "comments") 
     .add(Projections.property("state.name"), "state")) 
    .setResultTransformer(Transformers.aliasToBean<LabstateDto>()) 
    .setMaxResults(1); 

return (List<LabstateDto>)criteria.list(); 

마지막 상태가 반환되는 둘 이상의 실험실을 반환하려는 경우 Labstate에서 Lab ony까지의 역 참조를 클래스에 포함하지 않았기 때문에 쉽지 않은 또 다른 쿼리가 필요합니다.

업데이트 : 귀하의 의견에 따라 대안 쿼리

Criteria criteria = session.createCriteria(Lab.class, "lab") 
    .add(Restrictions.like("name", "%" + labSearch.getName() + "%")); 
    .createAlias("states", "labstate") 
    .add(Subqueries.proptertyEq("labstate.Id", DetachedCriteria.for(Lab.class) 
     .add(Restrictions.propertyEq("id", "lab.id")); 
     .createAlias("states", "lstate") 
     .createAlias("labstate.state", "state") 
     .add(Restrictions.eq("name", state)); 
     .addOrder(Order.desc("labstate.date")) 
     .setProjection(Projection.property("labstate.Id")) 
     .setMaxResults(1) 
    ); 

return (List<Lab>)criteria.list(); 
+0

덕분에 그러나 당신이 언급 한 바와 같이, 나는 특정 상태를 가진 모든 실험실이 필요합니다. 네이티브 SQL을 사용하여 해결 한 다음 엔티티 Labs에 추가했습니다. 최적 일지는 모릅니다. – grteibo

+0

당신은 마지막 labstate가 필요하거나 상태 객체의 이름 만 필요합니까? – Firo

+0

검색 기준을 충족하는 연구소 목록이 필요하다면 Lab.getState()를 사용하여 상태를 가져올 수 있습니다. 그러나 내가 국가별로 검색을한다면 각 실험실의 현재 상태를 검색하면됩니다. – grteibo

관련 문제