2012-08-30 5 views
10

Ich versuche, eine Abfrage zu machen, wo ich überprüfen möchte, ob entweder die E-Mail oder der Name eines Benutzers mit einer gegebenen Zeichenfolge beginnt. In einer SQL-Abfrage würde ich dieseEbean mit OR in Abfrage

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

In ebean Abfrage schreiben würde ich erwarten, so etwas wie zu schreiben:

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

Das Problem ist, dass die oder nimmt in einem Ausdruck, nicht eine Ausdrucksliste, das was ich bekomme, wenn

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

Schreiben wie ich es tun eine Abfrage wie folgt verstehen:

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

verwendet AND.

Wie kann ich eine solche Abfrage mit Ebean schreiben?

Danke!

Antwort

23

Ihr zweiter Versuch fast in Ordnung ist, müssen Sie die or()

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

natürlich nur com.avaje.ebean.Expr.like() innen verwenden können Sie einen Import für kürzeren Code verwenden ::

import com.avaje.ebean.Expr; 

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

überprüfen Sie die API in Javadoc: http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/Expr.html

+0

Ich konnte dies nirgendwo auf der Avaje-Ebean-Dokumentseite finden, und ich bin neu bei ebine. Danke für die Antwort!;) –

+0

@RunarHalse: Ich klebte Verbindung zu javadocs - kann nützlich sein :) – biesior

+0

Ihr Beispiel zeigt zwei Alternativen. Wie geht es dir ODER mehr als 2 Dinge? – TomL

-1

über mehr als 2 OR gefällt, können Sie dieses versuchen ...

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

Beachten Sie, dass die Abfrage in flüssigem Stil geschrieben werden kann disjunction mit():

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

Wenn es mehr als eine Disjunktion() ist/Verbindung(), dann verwenden Sie endJunction() zu beenden, dass OR und UND Gruppe.

Im Beispiel ist nur eine einzige ODER-Gruppe erforderlich, daher wird endJunction() nicht benötigt.

+0

Danke dafür. Ich versuchte herauszufinden, wie eine verschachtelte Folge von AND/OR-Klauseln in der Abfrage ausgeführt werden kann. Dies scheint der richtige Weg zu sein. –

+0

'disjunction()' und 'conjection()' bietet viel mehr Flexibilität als 'oder()' oder 'und()', besonders wenn es erforderlich ist, mehr als 2 Ausdrücke zu verwenden. – biesior

4

Beachten Sie, dass Sie den Flüssigkeitsstil auch über disjunction(), conjection() und endJunction() verwenden können.

Zum Beispiel:

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"); 

Und ein Beispiel sichere Abfrage Bohnen mit Typ es ist ähnlich, aber stattdessen verwendet oder() und(), endAnd(), Endor() ... eher als Disjunktion ()/conjection() etc.

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();