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子句中省略,即该参数的noeq()
语句
代码片段:
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')}”
”的操作来生成查找程序名称是很简单的,但是如何知道分配给的应该加载用户实例,并且状态应该引用任务状态
,我不想这样做。这是一篇论文,所以我希望代码尽可能干净。我可以建议一个命名查询吗?然后你可以按用户和状态筛选出来。我认为他们摇滚!