Grails使用下拉菜单筛选数据

Grails使用下拉菜单筛选数据,grails,filter,Grails,Filter,我想为我的表添加一个数据过滤器。有人能帮我吗? 我已经为列表控制器编写了代码,但是我没有 知道如何在我的.gsp文件中实现“mitarbeiterSelectedId” 目前,我有以下代码片段 这是我的控制器“列表” def list(Integer max) { def mitarbeiterList = Mitarbeiter.listOrderByNachname() if (params.selectedMitarbeiterId != null &&

我想为我的表添加一个数据过滤器。有人能帮我吗? 我已经为列表控制器编写了代码,但是我没有 知道如何在我的.gsp文件中实现“mitarbeiterSelectedId”

目前,我有以下代码片段

这是我的控制器“列表”

def list(Integer max) {
    def mitarbeiterList = Mitarbeiter.listOrderByNachname()

    if (params.selectedMitarbeiterId != null && params.selectedMitarbeiterId != '-1'){
        mitarbeiterList = [Mitarbeiter.findById(params.selectedMitarbeiterId)]
    }
    [mitarbeiterInstanceList: mitarbeiterList, mitarbeiterInstanceTotal: Mitarbeiter.count() ]
} 
这是我的名单

    <g:select id="mitarbeiter" name="mitarbeiterId" from="${Mitarbeiter.list()}" optionValue="nachname"
          optionKey="id"
          noSelection="${['-1': 'Bitte auswählen...']}" onchange="selectedMitarbeiterId"/>

<g:actionSubmit value="submit" onclick="" >OK</g:actionSubmit>


<table>
    <thead>
    <tr>

        <g:sortableColumn property="nachname" params="[controller: 'mitarbeiter']"
                          title="${message(code: 'mitarbeiter.nachname.label', default: 'Nachname')}"/>

        <g:sortableColumn property="vorname" params="[controller: 'mitarbeiter']"
                          title="${message(code: 'mitarbeiter.vorname.label', default: 'Vorname')}"/>

        <g:sortableColumn property="sollpensum" params="[controller: 'mitarbeiter']"
                          title="${message(code: 'mitarbeiterHistory.sollpensum.label', default: 'Sollpensum')}"/>

        <sec:ifAllGranted roles="ROLE_ADMIN">

            <g:sortableColumn property="gehalt" params="[controller: 'mitarbeiter']"
                              title="${message(code: 'mitarbeiterHistory.gehalt.label', default: 'Gehalt')}"/>

        </sec:ifAllGranted>
        <th><g:message code="mitarbeiterHistory.bereich.label" default="Bereich"/></th>

    </tr>
    </thead>
    <tbody>
    <g:each in="${Mitarbeiter.list()}" status="i" var="mitarbeiterInstance">
        <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">

            <td><g:link action="show" controller="mitarbeiter"
                        id="${mitarbeiterInstance.id}">${fieldValue(bean: mitarbeiterInstance, field: "nachname")}</g:link></td>

            <td>${fieldValue(bean: mitarbeiterInstance, field: "vorname")}</td>

            <td>${fieldValue(bean: mitarbeiterInstance.histories, field: "sollpensum")}</td>

            <sec:ifAllGranted roles="ROLE_ADMIN">
                <td>${fieldValue(bean: mitarbeiterInstance.histories, field: "gehalt")}</td>
            </sec:ifAllGranted>

            <td>${fieldValue(bean: mitarbeiterInstance.histories, field: "bereich")}</td>
        </tr>
    </g:each>
    </tbody>
</table>
因此,当我插入代码时,它如下所示:

class Employee{

String firstname
String lastname

static hasMany = [histories:EmployeeHistory]


static constraints = {
    firstname nullable: false, blank: false, minSize: 2, matches: "[a-zA-ZäöüÄÖÜßéèáàúùóò'\\- ]+"
    lastname nullable: false, blank: false, minSize: 2, matches: "[a-zA-ZäöüÄÖÜßéèáàúùóò'\\- ]+"
}

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

}
NewsItem.filterOnTitleILike(params?.title).
filterOnMessageILike(params?.message).
list()
如果在下拉列表中未选择任何内容,我希望显示整个表格数据。
若我在下拉列表中选择了一名员工,我只想显示包含所选员工数据的表

目前这是我的员工名单

def list() {        
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    def employeeList = Employee.filteronLastname(params?.lastName).list(params)
    [employeeInstanceList: employeeList, employeeInstanceTotal: employeeList.totalCount ]
}
我必须在何处插入以下内容:

NewsItem.filterLastname(params?.Lastname).
list()

以及如何更改

以过滤数据,我们最近采用了另一种方法。为了实现灵活的过滤,我们使用NamedQuery实现了过滤方法

一个带有随机代码的小例子解释了这个想法!:

class NewsItem {
    String title
    String message

    static namedQueries = {
        filteronTitleILike { String inTitle ->
            if (inTitle && inTitle?.size() > 0) {
                ilike 'title', "%${inTitle}%"
            }
        }

        filteronMessageILike { String inMessage ->
            if (inMessage && inMessage ?.size() > 0) {
                ilike 'message', "%${inMessage }%"
            }
        }
    }
}
要使用过滤,我们现在可以执行以下操作:

class Employee{

String firstname
String lastname

static hasMany = [histories:EmployeeHistory]


static constraints = {
    firstname nullable: false, blank: false, minSize: 2, matches: "[a-zA-ZäöüÄÖÜßéèáàúùóò'\\- ]+"
    lastname nullable: false, blank: false, minSize: 2, matches: "[a-zA-ZäöüÄÖÜßéèáàúùóò'\\- ]+"
}

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

}
NewsItem.filterOnTitleILike(params?.title).
filterOnMessageILike(params?.message).
list()

使用这种方法的一个主要优点是,当数据从gsp发送到控制器时,我们非常灵活。如果params?.title未填充为null,则在namedquery中不考虑这一点。所以我们只给params?信息,它保持完美的工作状态

我在我的文章中插入了一个编辑部分。你能看一下吗?。'是一个安全的导航操作符,这是groovy语法。因此,您可以像这样使用namedQuery:Employee.filteronLastname(params?.lastname).list(params)这将为您提供应用了筛选器的员工。如果params.lastname未填充且为null,则使用“?”将确保不会得到null指针。很抱歉,我没有得到它。你能编辑代码片段吗?我编辑了代码,但不确定你想用下拉框做什么。在本例中,我假设您有一个g:textbox,其中可以包含您正在搜索的员工姓名的一部分。你能粘贴你的普惠制代码吗?我想有一个下拉框,显示员工的姓氏。在dropbox中选择员工时,我希望更新表。我只想显示所选的员工。你知道我的意思吗?