我想创建一个只查询具有空列表的行的查询。
我的模型中的列表:
public static final Finder<Long, BankDebit> find = new Finder<>(Long.class, BankDebit.class);
@ManyToMany(cascade = CascadeType.ALL)
public List<Mandate> mandates;
执行查询的函数:
public static ExpressionList<BankDebit> findFilter(sepaId, mandat, day ....) {
ExpressionList<BankDebit> exp = find
.fetch("creditor")
.fetch("debitor")
.fetch("mandates")
.where()
.eq("sepa.id", sepaId);
if (day > 0) {
dateMax = dateMax.withDayOfMonth(day);
exp.eq("executionDate", dateMax.toDate());
}
if (!mandat.isEmpty())
exp.eq("mandates.id", 0); // here is the problem
return exp
}
我只想查询BankDebit
空列表的mandates
。我尝试使用.isNull("mandates")
,.isNull("mandates.id")
,.lt("mandates.id", 1)
,.eq("mandates.id", null)
以及更多内容进行此操作...
我不会理解我应该怎么做。做rawSql
会非常痛苦(我没有粘贴函数的整个代码)
我尝试了很多东西,在谷歌上达到了很多第4页(从来都不是一个好兆头)。我刚刚用完了想法。
答案 0 :(得分:1)
List<Integer> idsWithoutMandates = new ArrayList<>();
List<SqlRow> rowList = Ebean.createSqlQuery("SELECT debits.id id " +
"FROM bank_debit AS debits " +
"LEFT JOIN bank_debit_mandate AS jointable ON (debits.id = jointable.bank_debit_id) " +
"WHERE (jointable.mandate_id IS NULL OR jointable.mandate_id = 0)").findList();
for (SqlRow sqlRow : rowList) idsWithoutMandates.add(sqlRow.getInteger("id"));
List<BankDebit> debitsWithoutMandates = BankDebit.find.where().in("id", idsWithoutMandates).findList();
答案 1 :(得分:0)
我发现虽然.isNull()
不起作用,.isNotNull()
确实有效。所以我做了一些丑陋的修改,使用现有的修改来找到其他人......
if (!mandat.isEmpty()) {
List<BankDebit> tmp = find.fetch("mandates").where().eq("sepa.id", sepaId).isNotNull("mandates.id").findList();
List<Long> ids = Lists.newArrayList();
for (BankDebit bd : tmp) {
ids.add(bd.id);
}
exp.not(Expr.in("id", ids));
}