ActiveJDBC和Java泛型
我有以下两个类,其中文档扩展了一个提供帮助函数的抽象类,其中一个是“find”方法,该方法基于一些简单的逻辑构建查询以查找记录ActiveJDBC和Java泛型,java,orm,activejdbc,Java,Orm,Activejdbc,我有以下两个类,其中文档扩展了一个提供帮助函数的抽象类,其中一个是“find”方法,该方法基于一些简单的逻辑构建查询以查找记录 public abstract class AbstractTable<T extends AbstractTable<T>> extends Model { ... public T find (String[] columns) { String whereClause = ""; List<
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);
}
}
公共抽象类AbstractTable扩展模型{
...
无法找到公共字符串(字符串[]列){
字符串whereClause=“”;
ClauseData=newArrayList()的列表;
for(字符串列:列){
对象数据=this.get(列);
如果(数据==null){
其中,子句+=列+“为空且”;
}否则{
其中,子句+=列+“=?和”;
其中,第15.1条添加(数据);
}
}
返回findFirst(whereClause.substring(0,whereClause.length()-5),whereClauseData.toArray());
}
}
公共类文档扩展了抽象表{
...
公共文档findExistingObject(文档文档){
String[]columns=新字符串[]{“court\u case\u id”、“number”、“name”、“file\u date”};
返回super.find(列);
}
}
当我运行此代码,并对文档调用“findExistingObject”方法时,我收到以下异常:
线程“main”org.javalite.activejdbc.InitException中的异常:
无法确定模型类名,是否确实已删除模型
仪器化
我已经完全确定我已经安装了这些类。当我将代码从AbstractTable移动到文档中时,一切工作都很完美。我希望有人能给我一些建议或帮助,让我知道我做错了什么
提前感谢。问题的确切原因不是泛型,而是检测。插装跳过抽象模型,这意味着方法
findFirst
在类Model
上调用,而不是在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());
}
public T find(String[]列)抛出NoSuchMethodException、InvocationTargetException、IllegalAccessException{
字符串whereClause=“”;
ClauseData=new ArrayList()的列表;
for(字符串列:列){
对象数据=获取(列);
如果(数据==null){
其中,子句+=列+“为空且”;
}否则{
其中,子句+=列+“=?和”;
其中,第15.1条添加(数据);
}
}
方法findFirst=getClass().getDeclaredMethod(“findFirst”,String.class,Object[].class);
返回(T)findFirst.invoke(null,whereClause.substring(0,whereClause.length()-5),whereClauseData.toArray());
}
这有点丑陋,但至少你可以在你所有的模型中应用这一点(如果这是你想要的)