2012-08-30 14 views
10

Sto tentando di effettuare una query in cui si desidera verificare se l'e-mail o il nome di un utente inizia con una determinata stringa. In una query SQL vorrei scrivere questo utilizzandoEbean utilizzando OR in query

name like 'queryString%' or email like 'queryString%' 

in Query ebean mi sarei aspettato di scrivere qualcosa di simile:

find.where().or(like('name', 'queryString%'), like('email', 'queryString%')); 

Il problema è che la o prende in un'espressione, non un expressionlist, che è ciò che ottengo quando si scrive

find.where().like(...,...) 

quanto ho capito facendo una query come questa:

find.where().like(.., ...).like(..., ...) 

utilizza AND.

Come posso scrivere una query utilizzando ebean?

Grazie!

risposta

23

Il vostro secondo tentativo è quasi OK, è necessario utilizzare solo com.avaje.ebean.Expr.like() all'interno del or()

find.where().or(
     com.avaje.ebean.Expr.like("email", email + "%"), 
     com.avaje.ebean.Expr.like("name", name + "%") 
).findUnique(); 

, naturalmente, è possibile utilizzare una di importazione per il codice più corto ::

import com.avaje.ebean.Expr; 

... 
find.where().or(Expr.like("email", email + "%"),Expr.like("name", name + "%")).findUnique(); 

Controllare l'API Javadoc: http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/Expr.html

+0

Impossibile trovare questo documento ovunque nella pagina di documenti ebea avaje, e sono nuovo di ebano. Grazie per la risposta però !;) –

+0

@RunarHalse: Ho incollato il link a javadocs - può essere utile :) – biesior

+0

Il tuo esempio mostra due alternative. Come fai O più di 2 cose? – TomL

-1

su più di 2 O LIKE, puoi provare questo ...

where.or(Expr.contains("name", inquire.q), 
        Expr.or(Expr.contains("address", inquire.q), Expr.contains("description", inquire.q))); 
2

Nota che la query può essere scritta in stile fluido utilizzando disgiunzione():

find.where().disjunction() 
    .like("email", email + "%") 
    .like("name", name + "%") 
    .findUnique(); 

Se v'è più di un disgiunzione()/congiunzione() quindi si utilizza endJunction() per porre fine che OR e E gruppo.

Nell'esempio è richiesto un solo OR group, pertanto non è necessario endJunction().

+0

Grazie per questo. Stavo cercando di capire come fare una serie annidata di clausole AND/OR nella query. Questo sembra essere il modo per farlo. –

+0

'disgiunzione()' e 'congiunzione()' offre molta più flessibilità di 'or()' o 'e()' specialmente quando vi è la necessità di utilizzare più di 2 espressioni in ciascuna. – biesior

4

Si noti che è anche possibile utilizzare lo stile fluido tramite disgiunzione(), congiunzione() e fineJunction().

Ad esempio:

Query<Conversation> query = Ebean.find(Conversation.class) 
    .where().eq("group.id", groupId) 
    .disjunction() 
    .conjunction() 
     .eq("open", false).eq("participants.user.id", userId) 
    .endJunction() 
    .eq("open", true) 
    .endJunction() 
    .orderBy("whenCreated desc"); 

E un esempio di utilizzo di tipo fagioli di query di sicurezza è simile ma utilizza o(), e(), endAnd(), Endor() ... invece di disgiunzione ()/congiunzione() ecc.

List<Customer> customers 
    = new QCustomer() 
    .billingAddress.city.equalTo("Auckland") 
    .version.between(1,100) 
    .billingAddress.country.equalTo(nz) 
    .registered.before(new Date()) 
    .or() 
    .id.greaterThan(1) 
    .and() 
     .name.icontains("Jim") 
     .inactive.isTrue() 
    .endAnd() 
    .endOr() 
    .orderBy() 
    .name.asc() 
    .id.desc() 
    .findList(); 
Problemi correlati