我使用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用户如何使用右侧的条件进行左连接?
答案 0 :(得分:0)
我也在使用Ebean,但在很多情况下我更喜欢对查询有一个很好的控制。由于你有一个LEFT JOIN和一些条件,我会把你的情况计算在“不那么琐碎”的情况下。那些。
如何使用 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个对象并提取所需的数据
还是使用 RawSql 对象?您可以使用RawSqlBuilder生成一个。然后使用类似:Ebean.find(models.A.class).setRawSql(...).findList();
编辑: 我不是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()