2010-02-04 2 views
17

실제로 결과 목록을 얻지 않고 동적으로 생성 된 HQL 쿼리의 결과 수를 얻고 싶다. 뭔가처럼 내가 가지고있는 쿼리이라고 말 : 나는 최대 절전 모드 설명서를 읽어Hibernate HQL : 실제로 결과를 반환하지 않고 결과의 개수를 얻는다.

select Company company LEFT OUTER JOIN FETCH products product 

그 : 당신은 그들을 반환하지 않고 쿼리 결과의 수를 셀 수

:

((Integer) session.createQuery("select count(*) from ....").iterate().next()).intValue() 

나는 ....을 내 쿼리로 대체해야한다고 생각했지만 HQL이 지원하지 않기 때문에 작동하지 않습니다. FROM에서 하위 선택합니다.

그래서 동적으로 생성 된 HQL 쿼리의 결과를 어떻게 계산해야합니까? 나는 그것을 실행하고 결과 목록의 .size()를 얻는 것이 불필요한 오버 헤드 일 수 있다고 생각한다.

건배!

** UPDATE : **

내 쿼리 변환이 정규식을 사용 :

Number num = (Number) em.createQuery(dynamicQuery.replaceAll("select \\w+ from ", "select count(*) from ")).getSingleResult(); 

을 그리고 난이 얻을 :

인용문

EJB 예외 :; java.lang.IllegalArgumentException : org.hibernate.QueryException : 쿼리 지정 조인 페칭 (join fetching),하지만 페치 된 연관의 소유자가 선택 목록에 존재하지 않음 [FromElement {명시 적, 콜렉션 조인, 조인 페치, 비 페치 -lazy 속성, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANT applicant0_, colums = {applicant0_.APPLICANT_ID, className = org. myCompany.product.entity.Product}}] [select count () from org.myCompany.applicant.entity.Applicant 신청인 LEFT OUTER JOIN FETCH 신청인. 제품 제품]; java.lang.IllegalArgumentException : org.hibernate.QueryException : 쿼리 지정 조인 페칭 (join fetching),하지만 페치 된 연관의 소유자가 선택 목록에 존재하지 않음 [FromElement {명시 적, 콜렉션 조인, 조인 페치, 비 페치 -lazy 속성, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANT applicant0_, colums = {applicant0_.APPLICANT_ID, className = org. org.myCompany.applicant.entity.Applicant 신청자 LEFT OUTER에서 myCompany.product.entity.Product}}] [선택 카운트 () 이것은 트릭을해야 applicant.products 제품]

답변

14

FETCH 조인

select count(*) FROM Company c JOIN ... 

하위 선택이 포함되어 있지 않으며 단지 Company을 반환하는 대신 카운트를 반환합니다.

편집 :FETCH이 현재 작동하지 않습니다. 엔티티를 쿼리에서 반환하지 않고 카운트 만 반환하므로 Hibernate는 불평합니다.그것이 도움이 제거 :

select count(product) from org.myCompany.applicant.entity.Applicant applicant 
    LEFT OUTER JOIN applicant.products product 
+0

예, 나는 그것을 시도 할 수 있습니다. 예외가 발생했습니다 : QueryException : 쿼리가 조인 페칭을 지정했지만 페치 된 연관의 소유자가 선택 목록에 없습니다. 전체 스택 추적을 보려면 내 updte를 참조하십시오. –

+0

@Markos : 답변을 업데이트했습니다. – Henning

+0

고마워, 효과가 있었어! –

12

당신은 사용하여 쿼리 결과의 수를 얻을 수 있습니다 :

criteria.setProjection(Projections.rowCount()); 
count=(Long) criteria.uniqueResult(); 

희망이

+4

이것은 도움이되지 않습니다. rowCount() 메소드는 Criteria API에 속하지만 OP는 HQL을 사용합니다. – jjmontes

+5

'count'에 대한 Criteria API를 검색했으며이 힌트는 유용했습니다. –

관련 문제