2016-11-22 83 views
0

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

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

当运行该代码,而“findExistingObject”方法被调用上的文档,我收到此异常:在线程“主” org.javalite.activejdbc.InitException

例外: 未能确定型号类名称,您确定型号已被 检测过?

我已经完全确定我已经安装了这些类。当我将AbstractTable中的代码移动到Document中时,一切都很完美。我希望有人能提供一些建议或帮助,这可能会告诉我我做错了什么。

在此先感谢。

回答

1

您的问题的确切原因不是泛型,而是仪器。仪器会跳过抽象模型,这意味着方法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()); 
} 

有一点丑的存在,但至少你可以在所有的模型应用此(如果这是你想要的)。