Ebean с использованием OR в запросе

Я пытаюсь сделать запрос, где я хочу проверить, начинается ли с электронной почты или имя пользователя заданная строка. В sql-запросе я написал бы это с помощью

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

В ebean-запросе я бы хотел написать что-то вроде:

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

Проблема в том, что или принимает выражение, а не список выражений, что я получаю при написании

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

Как я понимаю, он делает такой запрос:

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

использует AND.

Как написать такой запрос с помощью ebean?

Спасибо!

Ответ 1

Ваша вторая попытка почти полностью, вы должны использовать только 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

Ответ 2

Обратите внимание, что вы также можете использовать стиль жидкости через disjunction(), union() и 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");

И пример использования безопасного запроса beans аналогичен, но вместо этого использует или(), и(), endAnd(), endOr()... а не disjunction()/union() и т.д.

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

Ответ 3

Обратите внимание, что запрос может быть записан в стиле жидкости с использованием функции disjunction():

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

Если существует еще одна дизъюнкция()/union(), вы используете endJunction() для завершения этой группы OR и AND.

В этом примере требуется только одна группа OR, поэтому endJunction() не требуется.

Ответ 4

около 2-го или LIKE, вы можете попробовать это...

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