1

我有以下两个类,其中 Document 扩展了一个提供辅助函数的 Abstract 类,其中一个是“find”方法,它基于一些简单的逻辑构建查询以查找记录。

public abstract class AbstractTable<T extends AbstractTable<T>> extends Model {
  ...
    public T find (String[] columns) {
        String whereClause = "";
        List<Object>    whereClauseData = new ArrayList<Object> ();

        for (String column : columns) {
            Object  data = this.get(column);
            if (data == null) {
                whereClause += column + " is null AND ";
            } else {
                whereClause += column + " = ? AND ";
                whereClauseData.add (data);
            }
        }

        return findFirst (whereClause.substring(0, whereClause.length () - 5), whereClauseData.toArray());
    }
}


public class Document extends AbstractTable<Document> { 
...
    public Document findExistingObject(Document document) {
        String[] columns = new String[] {"court_case_id", "number", "name", "file_date"};
        return super.find (columns);
    }
}

当我运行此代码并在 Document 上调用“findExistingObject”方法时,我收到此异常:

线程“main”org.javalite.activejdbc.InitException 中的异常:无法确定模型类名称,您确定模型已被检测吗?

我已经完全确定我已经对课程进行了检测。当我将代码从 AbstractTable 移动到 Document 时,一切正常。我希望有人可以提供一些建议或帮助,这可能会告诉我我做错了什么。

提前致谢。

4

1 回答 1

2

您的问题的确切原因不是泛型,而是仪器。Instrumentation 会跳过抽象模型,这意味着该方法findFirst是在 class 上调用的Model,而不是在Document. 您需要调用findFirst模型上的方法Document。这是适合您的代码版本:

public T find (String[] columns) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    String whereClause = "";
    List<Object> whereClauseData = new ArrayList<>();

    for (String column : columns) {
        Object  data = get(column);
        if (data == null) {
            whereClause += column + " is null AND ";
        } else {
            whereClause += column + " = ? AND ";
            whereClauseData.add (data);
        }
    }

    Method findFirst = getClass().getDeclaredMethod("findFirst", String.class, Object[].class);
    return (T) findFirst.invoke(null, whereClause.substring(0, whereClause.length () - 5), whereClauseData.toArray());
}

那里有一点丑陋,但至少您可以将其应用于所有模型(如果这是您想要的)。

于 2016-11-23T18:16:30.357 回答