Ordenar en Query para la base de datos MySQL usando hibernate

Tengo una base de datos MySQL que incluye una tabla llamada 'Tarea'. y usé Hibernate para mapear los datos a la base de datos.

incluye estos campos: id, user_id, project_id, deliverable_id, activity_id, ...

Cuando recupero Tareas de Db, necesito ordenarlas por Proyecto al principio, y luego por Entregable y finalmente por Actividad.

         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            List<Task> tasks = (List<Task>)session.createQuery(
"from Task as t where t.user.username = :name order by t.project.key ASC").setString("name", username).list();
            orderByDeliverable(tasks);
            orderByActivity(tasks);



    private void orderByDeliverable(List<Task> tasks) {
       Collections.sort(tasks, new Comparator<Task>(){   
          public int compare(Task t1, Task t2) {
             if(t1.getProject().getId() == t2.getProject().getId()) 
               return t1.getDeliverable().getKey().compareToIgnoreCase(t2.getDeliverable().getKey());
             return 0;
          }
       });
    }

    private void orderByActivity(List<Task> tasks) {
        Collections.sort(tasks, new Comparator<Task>(){  
           public int compare(Task t1, Task t2) {
              if(t1.getProject().getId() == t2.getProject().getId()) 
             if(t1.getDeliverable().getId() == t2.getDeliverable().getId()) 
                return t1.getActivity().getKey().compareToIgnoreCase(t2.getActivity().getKey());
            return 0;
           }
       });
    }

Como puede ver en el código, utilicé dos métodos para clasificarlos por entregable y actividad, pero los clasifico por proyecto en la Consulta.

No soy bueno escribiendo consultas, ¿sabes alguna forma en que pueda ordenar todas las cosas en la consulta y obtener el mismo resultado?

preguntado el 29 de junio de 12 a las 19:06

1 Respuestas

Encontré la respuesta. Solo necesito usar esta consulta:

tasks = (List<Task>)session.createQuery("from Task as t where t.user.username = :name 
order by t.project.key ASC, t.deliverable.key ASC, t.activity.key ASC")
.setString("name", username).list();

Funcionó igual para mí.

En realidad busqué esta solución para acelerar la aplicación que he desarrollado. Probé cuál es más rápido. El resultado fue el mismo. No acelera la aplicación.

Respondido el 30 de junio de 12 a las 00:06

En términos de velocidad/rendimiento, la diferencia dependerá totalmente del número de tareas devueltas. El enfoque de clasificación de SQL funcionará mucho más cerca de la linealidad, de modo que, a medida que obtenga más resultados, el rendimiento general se mantendrá más cercano al rendimiento que ve ahora con menos resultados. E incluso si no espera obtener muchos resultados, en términos generales, mover el procesamiento y las actividades relacionadas con la memoria fuera de la JVM nunca es una mala idea; y especialmente aquí, ya que las bases de datos SQL son más adecuadas (dependiendo de su proveedor de base de datos e índices y demás) para la clasificación. - steve ebersole

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.