【问题标题】:Sorting in Query for MySQL database using hibernate使用休眠对 MySQL 数据库的查询进行排序
【发布时间】:2012-07-01 07:35:43
【问题描述】:

我有一个 MySQL 数据库,其中包含一个名为“Task”的表。我使用 Hibernate 将数据映射到数据库。

它包括以下字段:id、user_id、project_id、deliverable_id、activity_id、...

当我从 Db 中检索 Tasks 时,我需要先按 Project 排序,然后按 Deliverable 排序,最后按 Activty。

         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;
           }
       });
    }

正如您在代码中看到的,我使用了两种方法按可交付成果和活动对它们进行排序,但我在 Query 中按项目对它们进行排序。

我不擅长查询写作,你知道有什么方法可以在查询中进行所有排序并得到相同的结果吗?

【问题讨论】:

    标签: mysql sql database hibernate


    【解决方案1】:

    我找到了答案。我只需要使用这个查询:

    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();
    

    对我来说也一样。

    实际上,我正在寻找这个解决方案来加速我开发的应用程序。 我测试了哪个更快。结果是一样的。它不会加速应用程序。

    【讨论】:

    • 就速度/性能而言,差异完全取决于返回的任务数量。 SQL 排序方法的执行将更接近线性,因此当您处理更多结果时,整体性能将保持更接近您现在看到的更少结果的性能。即使您不希望返回很多结果,一般来说,将处理和与内存相关的活动移到 JVM 之外也不是一个坏主意。尤其是在这里,因为 SQL 数据库更适合(取决于您的数据库供应商和索引等)进行排序。
    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多