2013-04-16 43 views
0

我有一個grails web應用程序的列表函數。此列表將根據一些搜索條件填充表格。我使用Hibernate的createCriteria來嘗試實現這一點。grails list and createCriteria()

在這種情況下,他們可以通過2個不同的關鍵功能進行搜索。用戶名和用戶號碼。

我唯一的問題是試圖調整函數,以便如果它找到一個空值,它會提示用戶其中一個值爲空。用戶名必須有一個用戶號碼。如果由於某種原因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的源代碼。

如果有人知道我可以如何使用搜索條件或其他方法實現我的目標。我將不勝感激一些建議。

感謝

回答

5

各個關鍵點看:

  1. 首先,驗證params查看userName ans /或 userNumber是否通過,併發回消息給用戶以提供 有效信息。通過這種方式,您可以根除 用戶輸入錯誤的選項。
  2. 使用條件返回域對象列表。你必須迭代列表才能獲得userName/userNumber
  3. 一旦你有一個有效的用戶列表,你應該能夠相應地驗證每個用戶對象的userName/userNumber

這裏有一個例子:

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

非常感謝您的回答。它幫助我解決了我的問題! – CoffeePeddlerIntern

1

數據庫通常處理空值作爲特殊情況不匹配的算術運算,如「=」/EQ。所以你的情況,我會作出一些假設,如果我錯了,你可以糾正:

  1. 的用戶名是一個可空場
  2. userNumber是一個可空場
  3. 用戶必須具有在至少一個用戶名或userNumber(有點離奇的數據模型,但讓我們去用它)

在這種情況下,你可以做的是,一旦你得到的結果使用在標準的or條件,那麼空值測試:

def userList = userSearchCri.list() { 
    or{ 
     eq('username', username) 
     eq('userNumber', userNumber) 
    } 
} 
  • 如果您沒有得到結果,則找不到用戶。
  • 否則測試一個空的用戶名或userNumber並相應地提示用戶。
+0

謝謝您的回答草率!它幫助我走上了正確的軌道! – CoffeePeddlerIntern

1

您可以在條件內有條件。此外,我認爲你只需要一個結果(用戶名和userNumber是獨一無二的?),所以你可以使用get()代替list()

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

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

感謝您的回覆! – CoffeePeddlerIntern