5

相互にリンクされた 3 つのクラスがあります。

最初は、ページネーションなしでクエリを作成しましたが、すべての検索結果は問題ありませんでした。しかし、今はページネーションが必要で、最初のクエリ パターンを乱したくありません。明確な結果を得る方法はありますか。

Class Department{
    int id;
    String name;
    static hasMany = [courses:Courses]
}

Class Courses{
    String courseName;
    String courseCode;
    static hasMany = [student:Student]
    static belongsTo = [department:Department]
}

Class Student{
    String studentName;
    String address;
    static belongsTo = [courses:Courses]
}


//controller
def list = Department.createCriteria.listDistinct{
    if(params.id){
         and{eq{"id",params.id}}
    }
    and{
        courses{
            if(params.courseName){
                  and{eq("courseName",params.courseName)}
            }
        }
        and{
            student{
                 if(params.studentName){
                         and{eq("studentName",params.studentName)}
                 }
            }
        }
    }
}

実際のテーブルとドメインを示すことはできませんでしたが、関係は上記とほとんど同じです。微妙な結果に対しては非常にうまく機能しましたが、ページネーションできませんでした。いくつかの解決策を試しましたが、エラーが返されます。今までエラーを記録していません。listDistinct をページネーション パラメータに使用できないことを知りました。list は個別のパラメーターを提供しません。

プロジェクションを試みましたが、以前のようにすべての属性を取得できませんでした。それに対する解決策はありますか。3 つのテーブルのいずれかからのすべての関係を使用して、考えられるすべての属性から検索する必要があるためです。すべてのクエリを別の方法に切り替える必要がありますか?

4

4 に答える 4

7

少し前に同様のタスクで苦労しました-基準、ページネーション、および個別の作業を連携させるには、次のようにします。1. listDistinct() の代わりに list() を使用します。 2. ページネーションに maxResults と firstResult を使用します。 { 個別の 'id' } 個別の結果を取得するため 4. ID のリストを取得した後、getAll() メソッドを使用して実際のオブジェクトを取得します

それに参加すると、次のようになります。

def ids = Department.createCriteria().list() {
    projections {
        distinct 'id'
    }
    maxResults params.max
    firstResult params.offset

    if(params.id){
         and{eq{"id",params.id}}
    }
    and{
        courses{
            if(params.courseName){
                  and{eq("courseName",params.courseName)}
            }
        }
        and{
            student{
                 if(params.studentName){
                         and{eq("studentName",params.studentName)}
                 }
            }
        }
    }
}
return Department.getAll(ids)

(コードは現在テストされていません)

于 2013-06-10T23:03:26.220 に答える
1

ドキュメントによると

listDistinct () メソッドは、ページネーションオプション maxResult および firstResult ではうまく機能しません。ページネーションで明確な結果が必要な場合は、現時点では HQL を使用することをお勧めします。

于 2013-06-10T08:44:11.157 に答える