2013-01-21 12 views
7

ho le seguenti oggetti di dominio:Definizione o condizione con criteri Grails api

class User { 
    String name 
    Transaction transaction 

    static constraints = { 
     transaction nullable: true 
    } 
} 

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

voglio selezionare tutti users che non hanno alcuna operazione di successo. Ciò significa che voglio gli utenti senza alcuna transazione (transaction == null) e gli utenti che hanno una transazione con il valore corretto false (transaction.successful == false). Voglio farlo con l'API Criteria (perché può essere combinata con altre condizioni basate sull'input dell'utente).

ho provato questo:

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

Tuttavia, questo mi dà solo gli utenti che dispongono di una transazione (con il valore di successo false). Ma non ottengo gli utenti in cui transazione è null

Il codice seguente mostra come ho creato un po 'di dati di esempio:

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

La mia domanda criteri restituisce solo mike in questo caso. Ma voglio mike e pablo. Cosa mi manca?

risposta

7

Quindi il problema è che per impostazione predefinita un join interno. È necessario creare un alias per la tabella e definire il suo tipo di join:

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

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

Grazie molto, questo mi ha aiutato :-) – micha

+0

Nessun problema - felice di aiutare! –

Problemi correlati