Ebean使用OR查询

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编写此类查询?

谢谢!

5个回答

26

你的第二次尝试几乎正确,你只需要在or()内使用com.avaje.ebean.Expr.like()即可。

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

当然,您可以使用import来缩短代码:

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


我在avaje ebean文档页面上找不到这个记录,而且我对ebean还很陌生。不过还是谢谢你回答!;) - Runar Halse
你的例子展示了两个选择。如果要OR超过2个事物,该怎么做? - TomL
2
@TomL,恐怕唯一明智的方法是使用http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/RawSql.html构建查询 - 它不像常见的查找器那样舒适,但它非常灵活。否则,您需要用or包装oror。在您有完全动态的条件数量要检查的情况下,包装or表达式就没有意义了。 - biesior

7
请注意,您也可以通过使用disjunction()、conjunction()和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();

2
请注意,查询可以使用disjunction()以流畅的方式编写:
find.where().disjunction()
  .like("email", email + "%")
  .like("name",  name + "%")
  .findUnique(); 

如果有多个disjunction() / conjunction(),则使用endJunction()来结束OR和AND组合。
在这个例子中,只需要一个OR组,所以不需要使用endJunction()。

谢谢。我一直在尝试弄清楚如何在查询中进行嵌套的AND/OR子句。这似乎是解决方法。 - Jeremy Goodell
disjunction()conjunction()or()and()更加灵活,特别是当需要在每个函数中使用多于两个表达式时。 - biesior

0

您可以使用 raw(String,Object[]) 参见 原始表达式

new QMyEntity().raw("name like ? or email like ?","yourName","yourEmail").findOne();

-1

关于超过2个OR LIKE的情况,你可以尝试这样做...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接