2013-01-21 11 views
7

mam następujące obiekty domeny:Definiowanie lub stanu z kryteriami Grails api

class User { 
    String name 
    Transaction transaction 

    static constraints = { 
     transaction nullable: true 
    } 
} 

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

chcę zaznaczyć cały users, które nie mają udaną transakcję. Oznacza to, że chcę mieć użytkowników bez żadnych transakcji (transaction == null) oraz użytkowników, którzy mają transakcję z pomyślną wartością false (transaction.successful == false). Chcę to zrobić za pomocą API Criteria (ponieważ można to połączyć z innymi warunkami opartymi na danych wprowadzanych przez użytkownika).

Próbowałem to:

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

Jednak to daje mi tylko użytkowników, którzy mają transakcję (z udanym wartości false). Ale ja nie rozumiem użytkowników gdzie transakcja jest null

Poniższy kod pokazuje jak stworzyłem niektóre dane przykładowe:

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

Moje kryteria kwerenda zwraca tylko mike w tym przypadku. Ale chcę mike i pablo. czego mi brakuje?

Odpowiedz

7

Problem polega na tym, że domyślnie jest to sprzężenie wewnętrzne. Musisz utworzyć alias dla tabeli i określić jego typ dołączenia:

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

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

Wielkie dzięki, to pomogło mi :-) – micha

+0

Nie ma problemu - chętnie pomożemy! –

Powiązane problemy