引言
最近接了个老项目,框架用的hibernate,然后update语句有时候执行,有时候不执行,非常莫名其妙,百度了下发现网上有不少人也遇到过这种问题,遗憾的是他们的方法并不能解决我这个问题,无奈之下只好自己写个小工具类,测试可用,下面上代码。初次写博客,有错误或者可优化的地方欢迎大佬指出。
代码如下
/**
* 根据主键更新,如果字段为null则不修改
* @param obj 实体类
*/
public static void updateByIdSelective(Object obj) {
StringBuilder updateHql = new StringBuilder("update ");//拼接修改hql
Class aClass = obj.getClass();
String classSimpleName = aClass.getSimpleName();
updateHql.append(classSimpleName);
updateHql.append(" a set ");//随便取个别名
//取值,存到map集合中
HashMap<String,Object> resultMap = new HashMap<>();
Field[] fields = aClass.getDeclaredFields();
String whereSql = "";
for (Field field : fields) {
field.setAccessible(true);
String fieldName = field.getName();
try {
Object result = field.get(obj);
//由于hql拼接update语句有“,”不太好处理,直接修改主键,@Id即本框架的主键注解
Id annotation = field.getAnnotation(Id.class);
if(annotation!=null){
resultMap.put(fieldName,result);
updateHql.append(" a."+fieldName+"=(:"+fieldName+") ");
whereSql = " where a."+fieldName+"=(:"+fieldName+") ";
continue;
}
if(result!=null){
resultMap.put(fieldName,result);
updateHql.append(", a."+fieldName+"=(:"+fieldName+") ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
updateHql.append(whereSql);
Session session = SessionRepository.getCurrentSession();
Query query=session.createQuery(updateHql.toString());
Set<String> keySet = resultMap.keySet();
for (String key : keySet) {
Object value = resultMap.get(key);
query.setParameter(key,value);//hql注入
}
query.executeUpdate();//hql执行
SessionRepository.closeCurrentSession();
}