I가 기본적으로 응용 프로그램에 필요한 모든 데이터를 반환하는 기준 :최대 절전 모드 기준 : 별개의 실체 다음 제한
Criteria criteria = session.createCriteria(Client.class);
criteria.createAlias("address", "address");
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();
문제는 관계 클라이언트/주소가 양방향이다 : 클라이언트가 하나 개의 주소를 가지고와 하나의 주소는 둘 이상의 클라이언트에 속할 수 있습니다.
테이블에 표시되는 클라이언트의 수에 따라 "단일"클라이언트 개체를 가져 오려고합니다.
먼저 setFirstResult/setMaxResults가 실행되기 때문에 이미 적용된 제한 내에서 클라이언트가 복제됩니다. (그룹화하지 않은 애플리케이션 레벨이 사용 된 후에) hibernate는 중복 클라이언트의 떼를 얻음으로 결국 setMaxResults에 지정된 최대 클라이언트보다 적은 클라이언트로 끝납니다.
클라이언트/주소에 필요한 모든 열을 반환하지 않으므로 (투영 그룹)별로 그룹화 할 수 없으며 쿼리가 그룹화하는 그룹 만 반환합니다.
(요약하면, My table은 페이지 당 100 개의 결과를가집니다. 그러나 중복을 제거한 후 100 대신에 98 개의 결과가 나타납니다.) 그 이유는 제한이 LIMIT 0,100이 적용되기 때문에 최대 절전 모드가 적용될 때입니다.)
FetchMode.SELECT이 문제를 해결했습니다. 다른 모드는이 경우 작동하지 않습니다. –
FetchMode.SELECT는 훌륭합니다 ... 몇 가지 이유로 열심히 가져 오는 힘을 제외하고는. https://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/FetchMode.html을 참조하십시오. 가져 오는 엔티티의 pk에서 "뚜렷한"작업을 수행하기 위해 최대 절전 모드를 수행 할 방법이 없습니까? ?? 이것은 가장 명백한 사소한 일인 것처럼 보이며, 평소와 같이 최대 절전 모드는 우리를 위해 삶을 극도로 복잡하게 만듭니다. – Marc
그건 그렇고, HQL로이 작업을하는 것은 그 소리만큼이나 사소한 일입니다. 검색어에 "뚜렷한"이라는 단어를 추가하기 만하면됩니다. 이것이 Criteria API를 사용하는 것 자체가 너무 힘들다. 아직 OO 데이터베이스를 사용할 수 있습니까? – Marc