Hibernate动态更新HQL实现

[size=medium]
/**
* 动态更新
*
* @param t
* 更新对象
* @param keyName
* 主键名称
* @param annotationClass
* 更新对象中的属性为自定义对象时,该自定义对象的某个注解Class(自定义对象用到的注解最好是相同的某一个)
* @throws Exception
*/
protected <T> void dynamicUpdate(T t, String keyName,
Class<? extends Annotation> annotationClass) throws Exception {
Class<?> clazz = t.getClass();
PropertyDescriptor pd = new PropertyDescriptor(keyName, clazz);
Object obj = pd.getReadMethod().invoke(t);
Map<String, Object> map = new TreeMap<String, Object>();
Field[] fields = clazz.getDeclaredFields();// 得到所有的字段
Field[] superFields = clazz.getSuperclass().getDeclaredFields();// 获取父类的所有字段
Field[] newFields = (Field[])ArrayUtils.addAll(fields, superFields);

StringBuilder hql = new StringBuilder();
hql.append("update ").append(clazz.getSimpleName()).append(" t set");
hql.append(" t." + keyName + " = t." + keyName);
if (newFields != null && newFields.length > 0) {
StringBuilder setField = new StringBuilder();
for (Field field : newFields) {
int mod = field.getModifiers();
if (field.getName().equals(keyName) || Modifier.isFinal(mod)
|| Modifier.isStatic(mod) || Modifier.isAbstract(mod)) {//过滤掉所有的final、static属性
continue;
}
if (field.getClass().isAssignableFrom(List.class)
|| field.getClass().isAssignableFrom(Set.class)) {//过滤掉集合对象
continue;
}
pd = new PropertyDescriptor(field.getName(), clazz);
Method readMethod = pd.getReadMethod();
if(!readMethod.isAnnotationPresent(Column.class)){
continue;
}
Object value = readMethod.invoke(t);
if (value != null) {
if (value.getClass().isAnnotationPresent(annotationClass)) {//根据注解判断是否为自定义对象
pd = new PropertyDescriptor(keyName, value.getClass());
value = pd.getReadMethod().invoke(value);
setField.append(" t.")
.append(field.getName() + "." + keyName)
.append("=:").append(field.getName())
.append(",");
map.put(field.getName() + "Id", value);
} else {
setField.append(" t.").append(field.getName())
.append("=:").append(field.getName())
.append(",");
map.put(field.getName(), value);
}
}
}
if (setField != null && setField.length() > 0) {
hql.append(",").append(setField.substring(0, setField.lastIndexOf(",")));
}
}
hql.append(" where t." + keyName + "=:id");
map.put("id", obj);
Query query = session().createQuery(hql.toString());
if (map != null && map.keySet().size() > 0) {
Iterator<String> ite = map.keySet().iterator();
while (ite.hasNext()) {
String key = ite.next();
query.setParameter(key, map.get(key));
}
}
query.executeUpdate();
}
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值