【问题标题】:ActiveJDBC and Java Generics causingActiveJDBC 和 Java 泛型导致
【发布时间】:2016-11-22 21:26:44
【问题描述】:

我有以下两个类,其中 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”方法时,我收到此异常:

线程“主”org.javalite.activejdbc.InitException 中的异常: 无法确定模型类名称,你确定模型已经 仪表化?

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

提前致谢。

【问题讨论】:

    标签: java orm activejdbc


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-14
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多