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