2014-02-06 2 views
5

하나의 개별 쿼리를 생성하지 않아도되고 실제 쿼리를 위해 별도의 쿼리를 작성하지 않아도됩니다. 내가 발견 한 것은 SesssionImpl :: createQuery는 복잡한 쿼리에 상당한 시간이 걸리고 count와 기본 쿼리를 결합하여 하나의 createQuery 호출을 제거 할 수있다. SQL에서최대 절전 모드 지원 횟수 (*) 이상()

나는

select count(*) over(), col_A, col_B 
from TABLE_XX 
where col_C > 1000 

같은이가 최대 절전 모드에서 달성 할 수 할 수 있습니까?

는 (I 네이티브 SQL을 피하고 HQL과 분리 된 기준에 충실하려고 해요. 네이티브 SQL이 최대 절전 모드를 사용하는 목적을 패배 사용. 내 시스템이 지원하는 오라클, 사이베이스 모두)

+1

글쎄 네이티브 SQL을 항상 사용할 수 있습니다. 네가 그걸 피하고 싶다고 생각하는거야? –

+0

네, 네이티브 SQL을 피하고 HQL을 준수하고 기준을 분리하려고합니다. 네이티브 SQL을 사용하면 최대 절전 모드 사용 목적을 상실 할 수 있습니다. – user2596860

+0

기본 데이터베이스는 무엇입니까? –

답변

1
당신은이를 사용할 수 있습니다

-

return (Number) session.createCriteria("Book").setProjection(Projections.rowCount()).uniqueResult(); 
2

Hibernate의 @Formula 주석 해결 방법으로 작동 할 수 있습니다. 당신은 또한을 등록해야 할 수 있도록하지만, 정육점에게 생성 된 SQL을 최대 절전 모드 비트를이 방법

@Formula("count(*) over()") 
private Integer totalResults; 

다음 COUNT OVER 쿼리가 포함 @Formula 주석 수를 나타내는하기 위해 @Entity에 추가 열을 제공 쿼리에 불필요한 오버 헤드를 추가 할 수있는 명시 적으로 최대 절전 모드 종속성 (오히려 순수한 JPA 이상),이 열은 기본적으로로드됩니다 있도록 다른 하나의 단점, 거기에서 제외

public class CountOverQueryInterceptor extends EmptyInterceptor { 

    private static final long serialVersionUID = -2980622815729060717L; 

    @Override 
    public String onPrepareStatement(String sql) { 
     return super.onPrepareStatement(cleanCountOver(sql)); 
    } 

    /** 
    * Cleans the "{@code count(*) over()}" query fragment from Hibernate's sql 
    * decoration "{@code count(*) <alias>.over()}". 
    */ 
    static String cleanCountOver(String sql) { 
     return sql.replaceAll("(?i) (count)\\(\\*\\) \\w+\\.(over) \\(\\)", " $1(*) $2() "); 
    } 

} 

: Interceptor는 SQL을 청소 어디 coun t는 필요하지 않습니다. 열을 선택적으로 만들 수 있고 lazily loaded 일 수는 있지만 바이트 코드 계측이 필요하고 복잡성이 추가됩니다.

@Formula("count(*) over()") 
@Basic(optional = true, fetch = FetchType.LAZY) 
private Integer totalResults;