Ebean LEFT JOIN,右侧有条件

时间:2015-11-18 20:33:18

标签: playframework playframework-2.3 ebean

我使用Java / Play 2.4 / Ebean,我需要找到表A中表B中没有相应记录的所有记录。

这是我想要生成Ebean的SQL:

select a.*
from a
left join b
on a.b_id = b.id
where b.id is null;

我认为这可能是正确的代码,但它不是:

A = Ebean.find(models.A.class).fetch("bs").where().isNull("bs.id").findList();

通过获取表A的所有b(即" bs"),Ebean在b上添加左外连接。不幸的是,where()导致另一个(内部)连接到表b。像这样:

select a.*
from a
left outer join b
on a.b_id = b.id
join b
on a.b_id = b.id
where b.id is null;

显然这不起作用。

Ebean用户如何使用右侧的条件进行左连接?

1 个答案:

答案 0 :(得分:0)

我也在使用Ebean,但在很多情况下我更喜欢对查询有一个很好的控制。由于你有一个LEFT JOIN和一些条件,我会把你的情况计算在“不那么琐碎”的情况下。那些。

  1. 如何使用 SqlQuery

    final String sql = "select a.* from a left join b on a.b_id = b.id where b.id is null";
    
    SqlQuery sqlQuery = Ebean.createSqlQuery(sql);
    
    // execute the query returning a List of MapBean objects
    List<SqlRow> list = sqlQuery.findList();
    

    然后,您可以使用SqlRow个对象并提取所需的数据

  2. 还是使用 RawSql 对象?您可以使用RawSqlBuilder生成一个。然后使用类似:Ebean.find(models.A.class).setRawSql(...).findList();

  3. 的内容

    编辑: 我不是SQL专家,但不应该是这样的:

    原:

    select a.* from a left join b on a.b_id = b.id where b.id is null

    更改为:

    select a.* from a left join b on a.b_id = b.id and b.id is null

    这样你就可以在联接中拥有where条件。然后再次尝试RawSqlBuilder #parse()