因为我本人从毕业就一直使用的mybatis,写的是sql,但是公司的老代码需要进行维护性质的开发,需要使用hibernate。在使用过程中出现了一个很奇怪的问题
BarBoxTempInfo info = iBarBoxTempInfoEao.getBarBoxInfo(
p.getBarcode(), p.getCollectTime());
if (info == null) {// 不重复则添加
info = new BarBoxTempInfo();
info.setBarcode(p.getBarcode());
info.setOperateTime(FormatDate.parStr2Time(
p.getCollectTime(),
FormatDate.DATE_TIME_SEC_FOR_PRO));
info.setProduceBill(req.getProduceBill());
info.setHandleStatus(new BigDecimal(0));
info.setDeviceId(p.getDeviceId());
info.setCreateBy(req.getUserAccount());
info.setUpdateBy(req.getUserAccount());
info.setCreateTime(new Timestamp((new Date()).getTime()));
info.setUpdateTime(new Timestamp((new Date()).getTime()));
try {
iBarBoxTempInfoEao.save(info);
} catch (Exception e) {
e.printStackTrace();
}
} else {
errList.add(p.getBarcode());
}
以上是我的代码逻辑,通过调用getBarBoxInfo判定数据库是否有重复,如果有就计入errList。没有就新增数据。怪就怪在这里,我通过debug调试的时候发现getBarBoxInfo方法返回的是null,得到结果info=null所以通过了判定,然后调用了save方法,但是数据并没有添加到数据库之中,程序也并没有抛出任何异常,以下是我getBarBoxInfo方法中的代码
// StringBuilder sb = new StringBuilder("1=1");
// List<Object> params = new ArrayList<Object>();
// if (StringUtils.isNotBlank(barcode)) {
// params.add(barcode);
// sb.append(" and t.barcode = ?" + params.size());
// } else{
// sb.append(" and ( t.barcode = '' or t.barcode is null) " );
// }
// if (StringUtils.isNotBlank(collectTime)){
// params.add(collectTime);
// sb.append(" and t.operateTime = ?" + params.size());
// }else{
// sb.append(" and t.operateTime is null " );
// }
//
// return this.getResult(sb.toString(), params.toArray());
然后经过一系列的尝试,偶然发现,当我不调用getBarBoxInfo方法,直接定义BarBoxTempInfo info = null,然后就save成功了。后续我没有使用jpql,改为sql也save成功了。以下是getBarBoxInfo里面的save成功的代码。
StringBuffer sql = new StringBuffer(" SELECT * FROM BAR_BOX_TEMP_INFO t WHERE 1=1 ");
List<Object> params = new ArrayList<Object>();
if (StringUtils.isNotBlank(barcode)) {
params.add(barcode);
sql.append(" and t.BARCODE = ?" + params.size());
} else{
sql.append(" and ( t.BARCODE = '' or t.BARCODE is null) " );
}
if (StringUtils.isNotBlank(collectTime)) {
params.add(collectTime);
sql.append(" and TO_CHAR(t.OPERATE_TIME,'YYYY-MM-DD hh24:mi:ss') = ?" + params.size());
} else{
sql.append(" and TO_CHAR(t.OPERATE_TIME,'YYYY-MM-DD hh24:mi:ss') IS null " );
}
List<BarBoxTempInfo> list = this.getResultListBySql(sql.toString(), params.toArray());
if(list!=null&&list.size()>0){
return list.get(0);
}
这就是我疑惑的地方,调用getBarBoxInfo方法返回的是null,但是save不成功,直接定义info=null,save成功。有没有使用过hibernate的程序员老手来解答一下疑惑?