2012-08-30 18 views
10

ユーザーの電子メールまたは名前のいずれかが指定された文字列で始まるかどうかを確認したいクエリを作成しようとしています。 SQLクエリの私のような何かを書くために私が期待するebeanクエリでクエリーでORを使用しているEbean

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

を使用して、これを記述します。

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

問題はあることや式ではなく、expressionlistにとります

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

を書くとき、私はそれがこのようなクエリをやって理解として、私が得るものです:

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

はANDを使用しています。

ebeanを使用してこのようなクエリを作成するにはどうすればよいですか?

ありがとうございます!

答えて

23

あなたの第二の試みはあなたが短いコードのインポートを使用することができますもちろんのor()

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

内だけcom.avaje.ebean.Expr.like()を使用する必要があり、ほとんどOKです::

import com.avaje.ebean.Expr; 

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

でAPIをチェックJavadoc:http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/Expr.html

+0

これはavaya e-docsのページのどこにも記載されていませんでした。私はebeanを初めて使用しています。しかしお返事ありがとうございます!) –

+0

@RunarHalse:javadocsへのリンクを貼り付けました - 便利です:) – biesior

+0

あなたの例は2つの選択肢を示しています。どうやって2つ以上のことをするのですか? – TomL

-1

約2以上のように、これを試すことができます。

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

クエリは論理和を用いて流体のスタイルで書くことができることに注意してください():

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

つ以上の論理和は、()/組み合わせ()がある場合、あなたはそれを終了するendJunction()を使用するかとANDグループ。

この例では、1つのORグループのみが必要なので、endJunction()は必要ありません。

+0

ありがとうございます。私はクエリでAND/OR句のネストされたシリーズを行う方法を把握しようとしていました。これはそれを行う方法と思われる。 –

+0

'disjunction()'と 'connections()'は、それぞれに2つ以上の式を使用する必要がある場合、特に 'or()'や 'and()'よりも柔軟性があります。 – biesior

4

また、disjunction()、connections()およびendJunction()を使用して流体スタイルを使用することもできます。例えば

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

そして、タイプセーフクエリ豆を使用した例では、それは似ていますが、代わりに使用していますか()、および()、endAnd()、エンドア()...ではなく論理和よりも( )/接続()など

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(); 
関連する問題