使用dbutils反射虚拟实体(实际数据库没有相对应的表)
比较复杂的SQL语句:
String sql="select scope_unit.name as '单元',SUM(t_question.successNum)/SUM(t_question.num)*100 as '正确率%',SUM(t_question.num) as '完成题目次数' "
+ "from t_question,t_scope as scope_section,t_scope as scope_unit "
+ "where t_question.scope_pk_scope_id=scope_section.pk_scope_id "
+ ......";
创建domain包:
/**
* 各单元正确率分析的虚拟表
* @author Nan
*
*/
public class NameRateCount {
private String ScopeName;//名称
private String accuracy;//正确率
private String answerCount;//答题次数
public String getAnswerCount() {
return answerCount;
}
public void setAnswerCount(String answerCount) {
this.answerCount = answerCount;
}
public String getAccuracy() {
return accuracy;
}
public void setAccuracy(String accuracy) {
this.accuracy = accuracy;
}
public String getScopeName() {
return ScopeName;
}
public void setScopeName(String scopeName) {
ScopeName = scopeName;
}
@Override
public String toString() {
return "NameRateCount [ScopeName=" + ScopeName + ", accuracy="
+ accuracy + ", answerCount=" + answerCount + "]";
}
}
其中id为年级、教材版本以及科目所对应的唯一标识,可以查出该年级的版本科目的所有单元的名称,正确率,答题次数
List<NameRateCount> lists=getForList(sql, id);
其中getForList核心代码如下:
/**
* 返回 T 所对应的 List
* @param sql
* @param args
* @return
*/
public List<T> getForList(String sql, Object ... args){
try {
connection = JdbcUtils.getConnection();
//System.out.println(connection);
return queryRunner.query(connection, sql, new BeanListHandler<>(clazz), args);
} catch (Exception e) {
e.printStackTrace();
} finally{
JdbcUtils.releaseConnection(connection);
}
return null;
}
然而运行结果却报空指针异常:
而且查出来的lists的值为空,然而却有长度。即有查询记录,但值为空。
以上证明,虚拟表的字段的值没有被插入,但实际上有尝试执行插入操作,只不过没成功。
原因可能是sql语句别名与虚拟实体的字段名称不相匹配造成的,试改之:
String sql="select scope_unit.name as ScopeName,SUM(t_question.successNum)/SUM(t_question.num)*100 asaccuracy,SUM(t_question.num) asanswerCount ......“
成功!
myeclise每次修改代码,都要重新发布,好麻烦?
答:Window-Show View-Service