grails list和createCriteria()

时间:2013-04-16 14:33:17

标签: list search grails createcriteria

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

在这种情况下,他们可以搜索2个不同的主要功能。用户名和userNumber。

我唯一的问题是尝试定制函数,以便在找到空值时,它会提示用户其中一个值为null。用户名必须有userNumber。如果由于某种原因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的源im。

如果有人知道我如何能够实现我的目标,可以使用搜索条件或其他方法。我非常感谢你的一些建议。

由于

3 个答案:

答案 0 :(得分:5)

要看的各个要点:

  1. 首先,验证params以查看是否userName ans /或     传递userNumber,并向用户发回消息以提供     有效信息。通过这种方式你消除了选择     用户输入错误。
  2. 使用Criteria返回域对象列表。您必须遍历列表才能获得userName/userNumber
  3. 获得有效的用户列表后,您应该能够相应地为每个用户对象验证userName/userNumber
  4. 以下是一个示例:

        def list(params) {
            def userNumber = params.searchUserNumber
            def username = params.searchUsername
            //Validate whteher 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 
                }
              }
            }
    }
    

答案 1 :(得分:1)

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

  1. username是可以为空的字段
  2. userNumber是可以为空的字段
  3. 用户必须至少拥有一个用户名或userNumber(一种奇怪的数据模型,但让我们一起去)
  4. 在这种情况下,你可以做的是在你的标准中使用or条件,然后在得到结果后测试空值:

    def userList = userSearchCri.list() {
        or{
          eq('username', username)
          eq('userNumber', userNumber)
        }
    }
    
    • 如果没有结果,则找不到该用户。
    • 否则测试空用户名或userNumber并相应地提示用户。

答案 2 :(得分:1)

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

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

  if(params.userNumber) {
    eq('userNumber',params.userNumber)
  }
}