0

我有一个 grails web 应用程序的列表功能。此列表将根据某些搜索条件填充表格。我使用 hibernate createCriteria 来尝试实现这一点。

在这种情况下,他们可以通过 2 个不同的关键特征进行搜索。用户名和用户编号。

我唯一的问题是尝试定制函数,以便如果它找到一个空值,它将提示用户其中一个值为空。用户名必须有一个用户编号。如果由于某种原因 userNumber 出现 null 那么它需要提示用户。或者如果没有找到用户名和userNumber的组合,也会提示用户。

这是我的带有搜索条件的列表功能。底部的 println 用于调试,并显示了我想要做什么。

def list(params) {
//TODO STILL NOT WORKING RIGHT  
def userSearchCri = User.createCriteria()

    def userNumber = params.searchUserNumber
    def username = params.searchUsername
    uerSearchCri = User.createCriteria()



    def userList = userSearchCri.list() {

        eq('username', username)
        eq('userNumber', userNumber)
    }

    System.out.println("Search: " + userList.userNumber)
    if(userList.userNumber == "null"){
        System.out.println("OH NO! The Users Number is = " + userList.userNumber + " DO SOMETHING!")
    }


    [userInstanceList: userList]
    } 

Iv 尝试了 createCriteria 函数的不同组合。像 isNotNull、ilike 等等……我开始认为我不能用 createCritera 做到这一点。这是我用于 createCriteria http://grails.org/doc/2.2.1/ref/Domain%20Classes/createCriteria.html的源代码。

如果有人知道我如何能够使用搜索条件或其他方法来实现我的目标。我将不胜感激一些建议。

谢谢

4

3 回答 3

6

需要查看的各种关键点:

  1. 首先,验证ans/or params是否通过,ans 向用户发送回消息以提供有效信息。通过这种方式,您正在消除用户输入错误的选项。userNameuserNumber
  2. 使用 Criteria 返回域对象列表。您必须遍历列表才能获得userName/userNumber.
  3. 一旦你有一个有效的用户列表,你应该能够userName/userNumber相应地验证每个用户对象。

这是一个示例:

def list(params) {
    def userNumber = params.searchUserNumber
    def username = params.searchUsername
    
    //Validate whether params are NULL or valid. Send back error message to user if validation fails
    validateParams()
    uerSearchCri = User.createCriteria()

    def userList = userSearchCri.list() {
        or{
            eq('username', username)
            eq('userNumber', userNumber)
        }
    }

    if(userList){
        userList.each{user->
            if(!user.userName || !user.userNumber){
                //Send error back if needed 
            }
        }
    }
}
于 2013-04-16T14:54:59.250 回答
1

数据库通常将空值作为不匹配算术运算(例如'='/eq)的特殊情况处理。因此,在您的情况下,我将做出一些假设,如果我错了,您可以纠正:

  1. 用户名是一个可为空的字段
  2. userNumber 是一个可为空的字段
  3. 用户必须至少有一个用户名或 userNumber(有点奇怪的数据模型,但让我们继续吧)

在这种情况下,您可以做的是or在您的标准中使用一个条件,然后在获得结果后测试空值:

def userList = userSearchCri.list() {
    or{
      eq('username', username)
      eq('userNumber', userNumber)
    }
}
  • 如果您没有得到任何结果,则找不到该用户。
  • 否则测试 null 用户名或 userNumber 并相应地提示用户。
于 2013-04-16T14:51:27.363 回答
1

您可以在条件中包含条件。另外我认为您只需要一个结果(用户名和用户编号是唯一的?),因此您可以使用get()而不是list()

def user = userSearch.get {
  if(params.username) {
    eq('username',params.username)
  }

  if(params.userNumber) {
    eq('userNumber',params.userNumber)
  }
}
于 2013-04-16T14:53:48.407 回答