верхние «N» строк в каждой группе с использованием критериев гибернации

#spring #hibernate #hibernate-criteria

#весна #гибернация #переход в спящий режим-критерии

Вопрос:

Верхние / нижние / случайные «N» строк в каждой группе с использованием критериев / проекций гибернации

Как получить 5 лучших вопросов для каждой подтемы

     DetachedCriteria criteria = DetachedCriteria.forClass(Question.class);
    ProjectionList projList = Projections.projectionList();
    projList.add(Projections.property("questionId"));
    projList.add(Projections.groupProperty("subTopicId"));
    criteria.setProjection(projList);
    List<Object> resultList = (List<Object>) getHibernateTemplate().findByCriteria(criteria);
    Iterator<Object> itr = resultList.iterator();
    List<Integer> questionIdList = new ArrayList<Integer>();
    while(itr.hasNext()){
        Object ob[] = (Object[])itr.next();
        System.out.println(ob[0] "  --  " ob[1]);
    }
  

Я использую приведенный ниже код для временного получения результата, есть ли какое-либо решение из гибернации с использованием Criteria API / любого другого альтернативного способа получения результата

    Set<Integer> getQuestionsBySubTopicWithLimit(Set<Integer> questionIdsSet, Integer subjectId, Integer limit, Integer status) {
   DetachedCriteria criteria = DetachedCriteria.forClass(Question.class);
    if(subjectId!=null amp;amp; subjectId!=0){
        criteria.add(Restrictions.eq("subjectId", subjectId));
    }
    if(status!=null){
        criteria.add(Restrictions.eq("status", status));
    }
    if(questionIdsSet!=null amp;amp; !questionIdsSet.isEmpty()){
        criteria.add(Restrictions.not(Restrictions.in("questionId", questionIdsSet)));
    }
    ProjectionList projList = Projections.projectionList();
    projList.add(Projections.property("questionId"));
    projList.add(Projections.property("subTopicId"));
    criteria.add(Restrictions.sqlRestriction("1=1 order by sub_topic_id, rand()"));
    criteria.setProjection(projList);
    List<Object> resultList = (List<Object>) getHibernateTemplate().findByCriteria(criteria);
    Iterator<Object> itr = resultList.iterator();
    Set<Integer> tmpQuestionIdsSet = new HashSet<Integer>();
    Integer subTopicId = 0, tmpSubTopicId = 0;
    Integer count = 0;
    while(itr.hasNext()){
        Object ob[] = (Object[])itr.next();
        if(count==0){
            subTopicId = (Integer) ob[1];
        }
        tmpSubTopicId = (Integer) ob[1];
        if(tmpSubTopicId!=subTopicId){
            subTopicId = tmpSubTopicId;
            count = 0;
        }
        count  ;
        if(count<=limit){
            tmpQuestionIdsSet.add((Integer) ob[0]);
        }
    }
    return tmpQuestionIdsSet;
    }