2016-08-16 3 views
0

Я использую Spring Data JPA с QueryDSL и пытаюсь использовать функцию Sum в том месте, где условие. Поскольку я использую разбиение на страницы, поэтому мне нужно сначала вычислить счет. Так у меня есть Java-код, как показано ниже: -Spring Data JPA с QueryDSL, подсчет количества с агрегатной функцией

NumberPath<Double> path = entityPath.getNumber("qty", Double.class); 
BooleanExpression exp = path.sum().loe(120);   
JPQLQuery countQuery = from(stock).where(exp); 
long count = countQuery.count(); 

его создания запроса, как это: -

select count(stock0_.stock_id) as col_0_0_ from stock stock0_ 
where sum(stock0_.qty)>=120; 

и я получаю Error Code: 1111. Invalid use of group function.

выше запрос не работает в SQL, а потому, что функция суммы не может использоваться со счетом, в котором условие. Я не знаю, как бороться с такой проблемой, когда мне нужно сначала подсчитать счет, а затем получить реальные данные. Может кто-то, пожалуйста, помогите мне с тем, что такое подход к решению этой проблемы.

Просьба не предлагать @Query аннотация, потому что я не могу ее использовать. Из-за необходимости динамической фильтрации.

ответ

1

Вы используете совокупные функции (суммы). Тогда вам нужно иметь() вместо этого где()

Этот пример действительно большой. Вам нужно только заботиться о разбиении на страницы и иметь элементы.

Если вы получили разные предикатов и pageRequest объекта.

Страница Пример запроса:

pageRequest = new PageRequest(
       MI_PAGE, 
       LIMIT, 
       Sort.Direction.valueOf(ASC), 
       ORDER_FIELD); 

EntityQ представляет собой QueryDSL генерируется мета-объект. Пример

Запрос:

new JPAQuery(em).from(entityQ).where(entityQ.id.in(

     new JPASubQuery() 
     .from(entity2Q).innerJoin(entity2Q.objEntityQ, entityQ) 
      .where(ENTITY, PREDICATE)       
      .groupBy(entity2Q.objEntityQ.id) 
      .having(Wildcard.count.goe(SIZE))     
     .list(entity2Q.objEntityQ.id) 

    )) 
    .offset(pageRequest.getOffset()) 
    .limit(pageRequest.getPageSize()) 
    .orderBy(ORDERS).list(entityQ); 

EDIT 2Более конкретно для Вашего примера:

Я обычно имеют контекст сохранения в моих пользовательских хранилищ:

@PersistenceContext 
EntityManager em 

Тогда, вы можете создать простой JPAQuery:

new JPAQuery(em) 
.from(YOUR_STOCK_QUERYDSL_ENTITY) 
.groupBy(YOUR_STOCK_QUERYDSL_ENTITY.field_to_sum) 
.having(YOUR_STOCK_QUERYDSL_ENTITY.field_to_sum.sum().as("alias") 
.goe(100)); 
+0

no Я не использую функцию группы –

+0

где sum (stock0_.qty)> = 120 - групповая функция. Это должно работать с сопоставлением have() или использовать JPASubquery. – crm86

+0

Не могли бы вы объяснить мне подробно или предоставить любую ссылку. Как использовать это с pagable –

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