2012-08-30 45 views
10

Bir e-posta veya kullanıcının adı verilen bir dizeyle başlayıp başlamadığını kontrol etmek istediğim bir sorgu oluşturmaya çalışıyorum. Bir sql sorgusu ben gibi bir şey yazmak için ben beklenebilir ebean sorgudaEbean OR sorgusunda OR sorgusunda

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

kullanarak yazarsınız:

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

sorun olduğunu veya bir ifadenin, değil bir Expressionlist, içinde aldığı olduğunu bunun böyle bir sorgu yapıyor anlamak gibi

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

yazarken ne alıyorum:

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

AND kullanıyor.

Ebean kullanarak böyle bir sorguyu nasıl yazabilirim?

Teşekkürler!

cevap

23

Kişisel ikinci girişim neredeyse Tamam, içeri API işaretleyin kısa kod ::

import com.avaje.ebean.Expr; 

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

için bir ithalat kullanabilirsiniz tabii or()

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

içeride sadece com.avaje.ebean.Expr.like() kullanmak zorunda Javadoc: http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/Expr.html

+0

Bu belgeyi herhangi bir yerde, herhangi bir belgede bulunamıyorum, ebje docs sayfasında ve ebean için yeniyim. Cevabınız için teşekkürler !;) –

+0

@RunarHalse: Bağlantıyı javadocs'a yapıştırdım - yararlı olabilir :) – biesior

+0

Örneğiniz iki alternatif gösterir. VEYA 2'den fazla şey nasıl? – TomL

-1

daha fazla 2 VEYA GİBİ, bunu deneyebilirsiniz ...

Sorgu ayrım() kullanılarak sıvı tarzında yazılabilir olduğunu
where.or(Expr.contains("name", inquire.q), 
        Expr.or(Expr.contains("address", inquire.q), Expr.contains("description", inquire.q))); 
2

Not: daha o tek ayırtım()/birlikte() o zaman sonuna kadar endJunction() kullanmak varsa

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

olduğunu YA ve VE grup.

Örnekte, yalnızca bir VEYA grubunun bulunması gerekiyor, bu nedenle endJunction() gerekli değildir.

+0

Bunun için teşekkürler. Sorguda yuvalanmış bir dizi AND/OR cümlesi nasıl yapılacağını anlamaya çalışıyordum. Bunu yapmanın yolu bu gibi görünüyor. –

+0

'disjunction()' ve 'conjunction()', özellikle her birinde 2'den fazla ifade kullanılması gerektiğinde 'veya()' veya 've()' den çok daha fazla esneklik sağlar. – biesior

4

Ayrıca sıvı stilini disjunction(), conjunction() ve endJunction() üzerinden de kullanabileceğinizi unutmayın. Örneğin

:

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

Ve tip güvenli sorgu fasulye kullanarak bir örnek, benzer ancak bunun yerine kullanan veya() ve(), endAnd(), Endor'a (...) yerine disjunction daha ()/conjunction() vb.

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