2015-09-10 1 views
0

Для элемента сетки, который у меня есть в моих веб-приложениях, у меня есть класс «GridModel», которому передается критерий.Число строк гибернации по критериям с уже установленным Проекция

В классе GridModel есть метод, позволяющий получить результаты для определенной страницы, добавив setFirstResult(...) и setMaxResults(...) к критериям.

Но мне также нужно общее количество строк для критериев, поэтому у меня есть следующий метод:

public int getAvailableRows() { 

    Criteria c = criteriaProvider.getCriteria(); 
    c.setProjection(Projections.rowCount()); 

    return((Long)c.uniqueResult()).intValue(); 
} 

Это работало отлично, но теперь у меня есть сетка, которая требует критериев, которые уже используют setProjection() в сочетание с setResultTransformer(). Похоже, что метод getAvailableRows() выше overridessetProjection() оригинальных критериев, создающих неправильные результаты.

Можно ли каким-либо образом обернуть критерии отсчета вокруг исходных критериев? Или как я могу это решить?

ответ

0

У меня был подобный опыт при попытке использовать Projections.rowCount() в сочетании с выражением groupBy. Я был в состоянии обойти вещи в слегка «Hacky» способом путем:

  1. Вспоминая предыдущую проекцию и результирующий трансформатор
  2. Установка проекции на критерии, которые будут модифицированной версии (смотри ниже)
  3. Выполнить количество строк БД ударило
  4. Восстановить предыдущую проекцию + трансформатор, так что критерии могут быть использованы для фактического результата извлечения, если

    final Projection originalProjection = criteriaImpl.getProjection(); 
    final ResultTransformer originalResultTransformer = 
        criteriaImpl.getResultTransformer(); 
    
    final Projection rowCountProjection; 
    
    // If we identify that we have a function with a group by clause 
    // we need to handle it in a special fashion 
    if (originalProjection != null && originalProjection.isGrouped()) 
    { 
        final CriteriaQueryTranslator criteriaQueryTranslator = 
         new CriteriaQueryTranslator(
          (SessionFactoryImplementor)mySessionFactory, 
          criteriaImpl, 
          criteriaImpl.getEntityOrClassName(), 
          CriteriaQueryTranslator.ROOT_SQL_ALIAS); 
    
        rowCountProjection = Projections.projectionList() 
         .add(Projections.rowCount()) 
         .add(Projections.sqlGroupProjection(
          // This looks stupid but is seemingly required to ensure we have a valid query 
          "count(count(1))", 
          criteriaQueryTranslator.getGroupBy(), 
          new String[]{}, new Type[]{})); 
    } 
    else 
    { 
        rowCountProjection = Projections.rowCount(); 
    } 
    
    // Get total count of elements by setting a count projection 
    final Long rowCount = 
        (Long)criteria.setProjection(rowCountProjection).uniqueResult(); 
    

Несколько предостережений здесь:

  1. Это все еще не будут давать ожидаемые результаты, если попытаться дать ему критерии с одной sum проекции, как и не считается isGrouped() проекция - это знак суммы с счет. Я не считаю это проблемой, потому что получение rowcount для выражения такого характера, вероятно, не имеет смысла
  2. Когда я имел дело с этим, я написал несколько модульных тестов, чтобы убедиться, что rowcount был как и ожидалось без прогнозов, с проекциями на основе свойств и с проекциями groupby, но я написал это из памяти, поэтому не могу гарантировать, что маленькие перегибы не нуждаются в глажении
Смежные вопросы