2014-11-21 3 views
3

У меня есть метод в хранилище:JPA сумма Критерии запрос с Spring Data выгружаемого

public Long sumOfPrices(Specification<Order> spec) { 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<Long> query = builder.createQuery(Long.class); 
    Root<Order> root = query.from(Order.class); 
    query.select(builder.sum(root.get(Order_.price))); 
    query.where(spec.toPredicate(root, query, builder)); 
    return sum = em.createQuery(query).getSingleResult(); 
} 

Как написать метод с выгружаемым?

public Long sumOfPrices(Specification<Order> spec, Pageable pageable) 

Я не знаю, куда звонить setMaxResult и setFirstResult, потому что сумма возвращает один результат.

+0

http://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/ может помочь –

ответ

2

Вы можете сделать следующее:

public Page<Long> sumOfPrices(Specification<Order> spec, Pageable pageable) { 
    // Your Query 
    ... 

    // Here you have to count the total size of the result 
    int totalRows = query.getResultList().size(); 

    // Paging you don't want to access all entities of a given query but rather only a page of them  
    // (e.g. page 1 by a page size of 10). Right now this is addressed with two integers that limit 
    // the query appropriately. (http://spring.io/blog/2011/02/10/getting-started-with-spring-data-jpa) 
    query.setFirstResult(pageable.getPageNumber() * pageable.getPageSize()); 
    query.setMaxResults(pageable.getPageSize()); 

    Page<Long> page = new PageImpl<Long>(query.getResultList(), pageable, totalRows); 
    return page; 
} 

То есть, как мы делаем это, я надеюсь, что это поможет.

Дополнительную информацию можно найти на: http://spring.io/blog/2011/02/10/getting-started-with-spring-data-jpa

+0

Вам нужно для добавления 'TypedQuery typedQuery = em.createQuery (query);' before 'int totalRows = ...'. Я использовал этот метод. 'typedQuery.getResultList(). size();' всегда возвращает 1, потому что называется 'query.select (builder.sum (root.get (Order_.price));'. – JDon

+0

вы запрашиваете процесс с возможностью просмотра, что запрос (сумма) не имеет смысла, я знал, но я хочу, чтобы вы изменили его в своем коде. Но поэтому я не путаю других людей, я их меняю. –

+0

Он работает, когда используется query.select (root.get (Order_.price)), но query.select (builder.sum (root.get (Order_.price))) возвращает единственный результат. Поэтому setMaxResults работает не так, как мне нужно. – JDon

Смежные вопросы