我想创建一个查询,只查询具有空列表的行。
我的模型中的列表:
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
会很痛苦(我没有粘贴函数的整个代码)我尝试了很多事情,并在Google上到达了许多第4页(从来没有一个好兆头)。我的想法没用了。
最佳答案
呵呵,实际上我想向您建议类似的解决方案,您的速度更快,可能更轻巧,因为它不需要对象映射:
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();