今天在java中拼接sql时犯了一个很低级的错误,sql语句拼接好以后,查询总是报ORA-00937: 不是单组分组函数,检查了好久都没没有找到错误的原因,在控制台打印的sql语句放到pl/SQL中执行也没错,但死活在junit测试的时候报ORA-00937的错误,忽然灵感来了,发现原来是我往dao中设置拼接好的sql语句不完整,group by子句和order子句都没有拼接到sql语句中。
代码如下: 灰色背景的语句应该在绿色背景语句下
this.getDAO();
log4j.info(LogUtil.cSqlLogString("数据库连接:",dao.getConnection().toString()));
StringBuffer lsSQL = new StringBuffer();
List<Object> laParameter=new ArrayList<Object>();
//开始时间
String btimecode = "";
//结束时间
String etimecode = "";
if(!"".equals(timecode)&&null!=timecode){
if(timecode.indexOf(",")!=-1){
btimecode=timecode.split(",")[0];
etimecode=timecode.split(",")[1];
btimecode=ZztDateUtil.getWeekBegin(Integer.valueOf(btimecode.substring(0,4)), Integer.valueOf(btimecode.substring(4,6)));
etimecode=ZztDateUtil.getWeekBegin(Integer.valueOf(etimecode.substring(0,4)), Integer.valueOf(etimecode.substring(4,6)));
}else{
btimecode=ZztDateUtil.getWeekBegin(Integer.valueOf(timecode.substring(0,4)), Integer.valueOf(timecode.substring(4,2)));
}
}
lsSQL.append(getWwtpSQL());
//开始时间不为空时
if(!"".equals(btimecode)&&null!=btimecode){
laParameter.add(btimecode);
lsSQL.append("\n and begintime>=to_date(?,'yyyy-MM-dd')");
}
//结束时间不为空时
if(!"".equals(etimecode)&&null!=etimecode){
laParameter.add(etimecode);
lsSQL.append("\n and begintime<=to_date(?,'yyyy-MM-dd')");
}
dao.setSQL(lsSQL.toString(), BaseDAO.DAOSQL,true);
lsSQL.append("\n group by regioncode,regionname ");
lsSQL.append("\n order by regioncode ");
int liIndex=1;
for(int liLoop = 0; liLoop < laParameter.size(); liLoop++){
dao.setParameterValue(liIndex++,laParameter.get(liLoop));
}
log4j.info(LogUtil.cSqlLogString("污水处理厂总量按直辖市汇总-"+btimecode+"至"+etimecode+":",lsSQL.toString()));
lRetMsg = dao.executeQuery(SysConfig.COMMON_DHO);