2013-01-21 66 views
7

我有以下的域對象:定義或病症Grails的標準API

class User { 
    String name 
    Transaction transaction 

    static constraints = { 
     transaction nullable: true 
    } 
} 

class Transaction {   
    boolean successful 
    User user   
    static belongsTo = User 
} 

我要選擇那些沒有成功的交易所有users。這意味着,我希望用戶沒有任何交易(transaction == null),並具有與成功的價值falsetransaction.successful == false)交易的用戶。我想用Criteria API來做到這一點(因爲這可以與基於用戶輸入的其他條件相結合)。

我嘗試這樣做:

def c = User.createCriteria() 
def results = c { 
    or { 
     isNull 'transaction' 
     transaction { 
      eq 'successful', false 
     } 
    } 
} 

但是這給了我只有那些交易(與成功的價值false)的用戶。但是,在交易null

我沒有得到用戶下面的代碼顯示瞭如何創建一些示例數據:

def createUserAndTransaction(String name, Boolean successful = null) { 
    User u = new User(name: name) 
    if (successful != null) { 
     Transaction t = new Transaction(user: u, successful: successful) 
     u.setTransaction(t) 
    } 
    u.save() 
} 

def init = { servletContext -> 
    createUserAndTransaction 'john', true 
    createUserAndTransaction 'mike', false 
    createUserAndTransaction 'pablo' 
} 

我的條件查詢只有在這種情況下返回mike。但我想要mikepablo。我錯過了什麼?

回答

7

所以問題是,它默認爲內連接。你必須爲表創建一個別名,並定義其連接類型:

createAlias("transaction", "t", CriteriaSpecification.LEFT_JOIN) 

or { 
    isNull("t") 
    eq("t.successful", false) 
} 
+0

謝謝你,幫我:-) – micha

+0

沒問題 - 很高興幫助! –