2013-01-21 9 views
7

Ich habe die folgenden Domain-Objekte:definieren oder einen Zustand mit Grails Kriterien api

class User { 
    String name 
    Transaction transaction 

    static constraints = { 
     transaction nullable: true 
    } 
} 

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

Ich möchte alle users wählen, die keine erfolgreiche Transaktion haben. Das heißt, ich möchte die Benutzer ohne jede Transaktion (transaction == null) und die Benutzer, die eine Transaktion mit dem erfolgreichen Wert haben false (transaction.successful == false). Ich möchte dies mit der Kriterien-API tun (weil dies mit anderen Bedingungen basierend auf Benutzereingaben kombiniert werden kann). diese

Ich habe versucht:

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

aber das gibt mir nur die Benutzer, die eine Transaktion haben (mit dem erfolgreichen Wert false). Aber ich habe nicht die Nutzer, wo Transaktion null

Der folgende Code zeigt, wie ich einige Beispieldaten erstellt:

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' 
} 

Meine Kriterien Abfrage gibt nur mike in diesem Fall. Aber ich möchte mike und pablo. Was vermisse ich?

Antwort

7

Das Problem ist also, dass es standardmäßig eine innere Verbindung ist. Sie haben einen Alias ​​für die Tabelle erstellen und definieren seine Join-Typ:

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

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

Vielen Dank, das hat mir geholfen :-) – micha

+0

Kein Problem - gerne helfen! –

Verwandte Themen