Ebean在查询中使用OR

Run*_*lse 11 ebean

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

name like 'queryString%' or email like 'queryString%'
Run Code Online (Sandbox Code Playgroud)

在ebean查询中,我希望写一些类似于:

find.where().or(like('name', 'queryString%'), like('email', 'queryString%'));
Run Code Online (Sandbox Code Playgroud)

问题是,或者接受表达式,而不是表达式列表,这是我在写作时得到的

find.where().like(...,...)
Run Code Online (Sandbox Code Playgroud)

据我所知,它做了这样的查询:

find.where().like(.., ...).like(..., ...)
Run Code Online (Sandbox Code Playgroud)

正在使用AND.

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

谢谢!

bie*_*ior 25

你的第二次尝试几乎没问题,你必须在com.avaje.ebean.Expr.like()里面使用or()

find.where().or(
        com.avaje.ebean.Expr.like("email", email + "%"),
        com.avaje.ebean.Expr.like("name",  name + "%")
).findUnique(); 
Run Code Online (Sandbox Code Playgroud)

当然你可以使用导入更短的代码::

import com.avaje.ebean.Expr;

...
find.where().or(Expr.like("email", email + "%"),Expr.like("name", name + "%")).findUnique();
Run Code Online (Sandbox Code Playgroud)

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

  • @TomL,恐怕只有明智的方法是使用http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/RawSql.html构建查询-但是,它不如普通查找器舒适它非常灵活。否则,您需要将“或”与“或”与“或”包装在一起,以防万一当您有完全动态的条件来检查包装“或”表达式时没有任何意义。 (2认同)

Rob*_*ave 5

请注意,您还可以通过disjunction(),conj()和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");
Run Code Online (Sandbox Code Playgroud)

并且使用类型安全查询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();
Run Code Online (Sandbox Code Playgroud)