2012-08-30 38 views
10

Tôi đang cố tạo truy vấn nơi tôi muốn kiểm tra xem email hoặc tên của người dùng có bắt đầu bằng một chuỗi nhất định hay không. Trong một truy vấn sql Tôi sẽ viết này sử dụngEbean sử dụng OR trong truy vấn

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

Trong truy vấn ebean tôi mong chờ để viết một cái gì đó như:

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

Vấn đề là hoặc mất trong một biểu thức, không phải là một expressionlist, mà là những gì tôi nhận được khi viết

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

Theo tôi được biết thực hiện một truy vấn như thế này:

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

đang sử dụng AND.

Tôi làm cách nào để viết truy vấn bằng cách sử dụng ebean?

Cảm ơn!

Trả lời

23

nỗ lực thứ hai của bạn là gần như OK, bạn phải sử dụng chỉ com.avaje.ebean.Expr.like() bên trong or()

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

tất nhiên bạn có thể sử dụng một khẩu đối với mã ngắn hơn ::

import com.avaje.ebean.Expr; 

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

Kiểm tra API trong Javadoc: http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/Expr.html

+0

Tôi không thể tìm thấy tài liệu này ở bất cứ nơi nào trên trang tài liệu ebean avaje, và tôi mới tham gia ebean. Cảm ơn bạn đã trả lời !;) –

+0

@RunarHalse: Tôi đã dán liên kết tới javadocs - có thể hữu ích :) – biesior

+0

Ví dụ của bạn cho thấy hai lựa chọn thay thế. Làm thế nào để bạn HOẶC nhiều hơn 2 điều? – TomL

-1

khoảng hơn 2 HOẶC THÍCH, bạn có thể thử ...

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

Lưu ý rằng các truy vấn có thể được viết theo kiểu chất lỏng sử dụng phân ly():

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

Nếu có nhiều rằng một phân ly()/kết hợp() sau đó bạn sử dụng endJunction() kết thúc mà OR và VÀ nhóm.

Trong ví dụ, chỉ có một nhóm OR duy nhất được yêu cầu như vậy, không cần endJunction().

+0

Cảm ơn vì điều này. Tôi đã cố gắng tìm ra cách để thực hiện một loạt các mệnh đề AND/OR trong truy vấn. Đây dường như là cách để làm điều đó. –

+0

'disjunction()' và 'kết hợp()' cho phép linh hoạt hơn nhiều so với 'hoặc()' hoặc 'và()' đặc biệt khi có yêu cầu sử dụng nhiều hơn 2 biểu thức trong mỗi. – biesior

4

Lưu ý rằng bạn cũng có thể sử dụng kiểu lỏng thông qua hàm tách rời(), kết nối() và endJunction().

Ví dụ:

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

Và một ví dụ sử dụng loại đậu truy vấn an toàn đó là tương tự nhưng thay vì sử dụng hoặc(), và(), endAnd(), Endor() ... chứ không phải là phân ly ()/kết hợp() vv

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(); 
Các vấn đề liên quan