【问题标题】:Ebean using OR in queryEbean 在查询中使用 OR
【发布时间】:2012-08-30 05:56:19
【问题描述】:

我正在尝试进行查询,以检查用户的电子邮件或用户名是否以给定字符串开头。在 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 编写这样的查询?

谢谢!

【问题讨论】:

    标签: ebean


    【解决方案1】:

    您的第二次尝试几乎没问题,您只需在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 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 新手。不过感谢您的回答!;)
    • 您的示例显示了两种选择。你如何 OR 超过 2 件事?
    • @TomL,恐怕唯一明智的方法是使用avaje.org/static/javadoc/pub/com/avaje/ebean/RawSql.html 构建查询 - 它不像普通查找器那样舒适,但它非常灵活。否则,您需要将ororor 包装起来,以防您有完全动态的条件来检查包装or 表达式没有意义。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      如果有多个 disjunction()/connection(),那么您使用 endJunction() 来结束那个 OR 和 AND 组。

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

      【讨论】:

      • 谢谢。我试图弄清楚如何在查询中执行一系列嵌套的 AND/OR 子句。这似乎是这样做的方法。
      • disjunction()conjunction()or()and() 提供更多的灵活性,尤其是在需要在每个表达式中使用超过 2 个表达式时。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        相关资源
        最近更新 更多