Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails 基于传递给控制器的参数动态创建查询_Grails_Groovy_Gorm - Fatal编程技术网

Grails 基于传递给控制器的参数动态创建查询

Grails 基于传递给控制器的参数动态创建查询,grails,groovy,gorm,Grails,Groovy,Gorm,在“我的任务管理”应用程序中,用户应该能够根据以下内容筛选任务:分配给、优先级、状态和/或截止日期 我不确定如何创建动态查询,因为它将基于可用参数构建查询 例如: 如果我有一个URL,例如:task/index?assignedTo=1&status=2 我可以仅基于这两个参数构建查询。我习惯的方法是 Task.findAllByAssignedToAndStatus( User.get(params.assignedTo), TaskStatus.get(params.status

在“我的任务管理”应用程序中,用户应该能够根据以下内容筛选任务:
分配给
优先级
状态
和/或
截止日期

我不确定如何创建动态查询,因为它将基于可用参数构建查询

例如:

如果我有一个URL,例如:
task/index?assignedTo=1&status=2

我可以仅基于这两个参数构建查询。我习惯的方法是

Task.findAllByAssignedToAndStatus(
   User.get(params.assignedTo),
   TaskStatus.get(params.status)
)
显然,我不想通过为每个可能的URL参数组合编写每个
findAllBy
查询来实现一个干式方法


<> Pr>在GRAILS中有一个很好的方法吗?

< P>我会考虑这个可搜索的插件()。很容易指定可搜索的
任务
的哪些属性。

我使用
createCriteria
实现了这一点,如下所示:

如果用户为该特定过滤器选择“All”,则我将对任何参数使用值0,因此它将从where子句中省略,即该参数的no
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
}

看看fluent接口,您可以使用它们添加或删除(过滤)每个参数


为此,我们在域类上实现了过滤功能。简言之,您可以将namedquerys的小片段添加到域类中

例如:

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

    }
}
这将启用细粒度过滤功能,因此您可以构建一个使用所有过滤方法的列表方法,并根据用户提供的输入将NamedQuery连接在一起

Employee.filteronFirstname("John").
filterOnLastname("Doe").
filteronAgeOlderThen("10").
list(params)

从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

通过执行类似于
“findAllBy${params.collect{k,v->k.capitalize()}.join('And')}”
”的操作来生成查找程序名称是很简单的,但是如何知道
分配给
的应该加载
用户
实例,并且
状态
应该引用
任务状态
,我不想这样做。这是一篇论文,所以我希望代码尽可能干净。我可以建议一个命名查询吗?然后你可以按用户和状态筛选出来。我认为他们摇滚!