11

我正在尝试进行查询,以检查用户的电子邮件或用户名是否以给定的字符串开头。在 sql 查询中,我会使用

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

在 ebean 查询中,我希望编写如下内容:

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

问题是 or 接受一个表达式,而不是一个表达式列表,这是我在编写时得到的

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

据我了解,它执行这样的查询:

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

正在使用 AND。

如何使用 ebean 编写这样的查询?

谢谢!

4

4 回答 4

26

您的第二次尝试几乎可以,您必须在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();

检查 Javadoc 中的 API:http ://www.avaje.org/static/javadoc/pub/com/avaje/ebean/Expr.html

于 2012-08-30T06:22:53.067 回答
7

请注意,您还可以通过 disjunction()、connection() 和 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");

还有一个使用类型安全查询 bean 的示例,它是类似的,但使用 or()、and()、endAnd()、endOr() ... 而不是 disjunction()/conjunction() 等。

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();
于 2015-12-02T18:58:52.590 回答
2

请注意,可以使用 disjunction() 以流畅的方式编写查询:

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

如果有多个 disjunction() / conjunction() 那么你用endJunction()结束那个 OR 和 AND 组。

在示例中,只需要一个 OR 组,因此endJunction()不需要。

于 2015-09-09T01:24:42.887 回答
-1

大约超过 2 个或 LIKE,你可以试试这个......

where.or(Expr.contains("name", inquire.q),
                    Expr.or(Expr.contains("address", inquire.q), Expr.contains("description", inquire.q)));
于 2015-04-30T15:36:25.013 回答