2

「タスク」という名前のテーブルを含む MySQL データベースがあります。そして、Hibernate を使用してデータをデータベースにマップしました。

次のフィールドが含まれます: id、user_id、project_id、deliverable_id、activity_id、...

DB からタスクを取得するときは、最初にプロジェクトで並べ替え、次に成果物で並べ替え、最後にアクティビティで並べ替える必要があります。

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

コードでわかるように、2 つの方法を使用して成果物とアクティビティで並べ替えましたが、クエリではプロジェクトで並べ替えています。

私はクエリの作成が苦手です。クエリですべての並べ替えを実行して同じ結果を得る方法を知っていますか?

4

1 に答える 1

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

それは私にとっても同じように機能しました。

実際、開発したアプリケーションを高速化するためにこのソリューションを探しました。どちらが速いかをテストしました。結果は同じでした。アプリケーションの速度は向上しません。

于 2012-06-29T23:27:17.757 に答える