5

assignedTo私のタスク管理アプリケーションでは、ユーザーは、、、および/またはpriorityに基づいてタスクをフィルタリングできる必要があります。statusdueDate

使用可能なパラメーターに基づいてクエリを作成するという点で、動的クエリを作成する方法がわかりません。

例えば ​​:

次のような URL がある場合:task/index?assignedTo=1&status=2

これら 2 つのパラメーターのみに基づいてクエリを作成できます。私が慣れている方法は、

Task.findAllByAssignedToAndStatus(
   User.get(params.assignedTo),
   TaskStatus.get(params.status)
)

findAllBy考えられるすべての URL パラメーターの組み合わせに対して各クエリを書き出すことによって、DRY メソッドを実装したくないことは明らかです。

grailsでこれを行う良い方法はありますか?

4

5 に答える 5

7

これを行うために、ドメイン クラスにフィルター機能を実装しました。つまり、namedQueries の小さなスニペットをドメイン クラスに追加します。

例:

class Employee {

    String firstname
    String lastname
    Integer age

    static constraints = {
    }

    static namedQueries = {
        filteronFirstname { String inFirstname ->
            if (inFirstname&& inFirstname?.size() > 0) {
                ilike 'firstname', "%${inFirstname}%"
            }
        }

        filteronLastname { String inLastname ->
            if (inLastname && inLastname?.size() > 0) {
                ilike 'lastname', "%${inLastname}%"
            }
        }

        filteronAgeOlderThen { String ageOlderThen ->
            if (age && age ?.size() > 0) {
                gt 'age', ageOlderThen as Integer
            }
        }

    }
}

これにより、きめ細かなフィルター機能が有効になるため、すべてのフィルター メソッドを使用する 1 つのリスト メソッドを構築でき、ユーザーが入力として指定した内容に応じて、名前付きクエリが結合されます。

Employee.filteronFirstname("John").
filterOnLastname("Doe").
filteronAgeOlderThen("10").
list(params)
于 2013-04-11T17:05:05.093 に答える
5

次のように使用して、これを機能させることができましたcreateCriteria

ユーザーが特定のフィルターで「すべて」を選択した場合、どのパラメーターにも値 0 を使用しているため、where 句から省略されます。つまりeq()、そのパラメーターのステートメントはありません。

コードのスニペット:

else
    {       
        def assignedTo = Integer.parseInt(taskParams.assignedTo)
        def priority = Integer.parseInt(taskParams.priority)
        def status = Integer.parseInt(taskParams.status)

        tasks = Task.createCriteria().list {            

            eq("project", Project.get(taskParams.PId))

            if(assignedTo > 0)
                eq("assignedTo", User.get(assignedTo))

            if(priority > 0)
                eq("priority", TaskPriority.get(priority))

            if(status > 0)
                eq("status", TaskStatus.get(status))                
        }           
    }
    return tasks
}
于 2013-04-11T14:04:02.797 に答える
1

これには Searchable Plugin を検討します ( http://grails.org/plugin/searchable )。Taskのどのプロパティを検索可能にするかを簡単に指定できます。

于 2013-04-11T11:29:18.277 に答える
0

URL からの動的 Where クエリに対する私のソリューション:

if (params.query) {
    def classLoader = getClass().getClassLoader();
    def query = new GroovyShell(classLoader).evaluate(
            "import myapp.Visit; Visit.where {$params.query}")
    visits = query.list(params)
} 

これは、次のような URL から制約を取得します。

visit/index?query=client.status=='suspect';atHome==false
于 2014-05-14T15:09:54.473 に答える