我想创建一个查询,只查询具有空列表的行。

我的模型中的列表:

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();

10-01 09:07