Ebean查找器列表大小情况

时间:2014-02-24 15:53:02

标签: java list playframework-2.0 ebean

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

我的模型中的列表:

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页(从来都不是一个好兆头)。我刚刚用完了想法。

2 个答案:

答案 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));
}