2012-08-30 30 views
10

我試圖做一個查詢,我想檢查用戶的電子郵件或名稱是否以給定的字符串開頭。在SQL查詢中我會使用在查詢中使用OR的Ebean

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

在ebean查詢我希望寫類似這樣寫:

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

的問題是,或發生在一個表達式,而不是一個與expressionlist,這是什麼讓我寫

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

時按我的理解做了這樣的查詢:

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

正在使用AND。

如何使用ebean編寫這樣的查詢?

謝謝!

回答

23

你的第二次嘗試幾乎是OK,你必須只com.avaje.ebean.Expr.like()使用or()

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

裏面,你可以使用導入的短代碼::

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

我在avaje ebean文檔頁面的任何地方找不到這個記錄,而我是ebean的新手。感謝您的答案!) –

+0

@RunarHalse:我粘貼鏈接到javadocs - 可以是有用的:) – biesior

+0

你的例子顯示了兩種選擇。你如何或超過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()結束這一OR和AND組。

在該示例中,只需要一個OR組,因此不需要endJunction()

+0

謝謝你。我試圖弄清楚如何在查詢中嵌套一系列的AND/OR子句。這似乎是做到這一點的方法。 –

+0

''分離()'和'連接()'比'或()'或'和()'提供了更大的靈活性,特別是當需要在每個表達式中使用2個以上的表達式時。 – biesior

4

請注意,您也可以通過disjunction(),linkage()和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();