用hibernate怎么修改指定字段的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用hibernate怎么修改指定字段的值相关的知识,希望对你有一定的参考价值。
比如sql语句是这样写
update table_name set name=? where id=?;
是不是hql语句能from Admin as admin set admin.status=? where admin.id=?这样写啊 我不要根据id先查找到在后再修改的那个复杂方法
hibernate中的update(obj)方法修改的是一个对象的所有字段,一旦只修改某个字段,其余字段会为null。在日常开发过程中,有时,我们没有必要修改所有的字段,所以我发现了一个小技巧:
1.前台传入某个字段(需要修改的),必须包括id主键:
2.在后台我们可以通过主键查询一遍改数据:
3.得到查询出的数据后,设置该对象要修改的字段值:
3.再传入该对象到dao的update(obj)方法进行修改即可。
参考技术A 参考。为什么用hibernate啊??http://blog.csdn.net/yu422560654/article/details/7741778
Hibernate 中如果直接使用
Session.update(Object o); 或则是Session.updateOrUpdate(Object o);
会把这个表中的所有字段更新一遍。
如:
[java] view plaincopyprint?ExperClass4k e = new ExperClass4k(); e.setTime(time); e.setQ_num(q_num); e.setK(k); if (str == "finch_fix") e.setFinch_fix_cost1(cost1); e.setFinch_fix_cost2(cost2); e.setFinch_fix_cost(cost1 + cost2); else if (str == "my") e.setMy_cost1(cost1); e.setMy_cost2(cost2); e.setMy_cost(cost1 + cost2); //session.save(e); session.saveOrUpdate(e);
我本想根据str判断,做出不同的更新策略,但是对于同一个time,Hibernate 的sql语句把所有字段都更改了一次(没有被set的值,Hibernate会直接赋值空)。
那么怎么只更改我们更新的字段呢?
有三种方法:
1.XML中设置property 标签 update = "false" ,如下:我们设置 age 这个属性在更改中不做更改
[html] view plaincopyprint?<property name="age" update="false"></property>
在Annotation中 在属性GET方法上加上@Column(updatable=false)
[java] view plaincopyprint?@Column(updatable=false) public int getAge() return age;
2.使用XML中的 dynamic-update="true"
[html] view plaincopyprint?<class name="com.sccin.entity.Student" table="student" dynamic-update="true">
OK,这样就不需要在字段上设置了。
但这样的方法在Annotation中没有
3.使用HQL语句(灵活,方便)
使用HQL语句修改数据
[java] view plaincopyprint?public void update() Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Query query = session.createQuery("update Teacher t set t.name = 'yangtianb' where id = 3"); query.executeUpdate(); session.getTransaction().commit(); 参考技术B 你可以直接传一个Admin对象 执行session.update(admin); 也可以 String hql = "from Admin as admin set admin.status=status where admin.id=id"; query = session.createQuery(hql); query.setString("status ", status ); query.setInteger("id", id) 不懂可以追问!! 参考技术C 第一种方法
先通过id找出Admin,然后更新
public void updateAdmin(Admin admin)
Session session=HibernateUtil.getSession();
ts=session.beginTransaction();
session.update(admin);
session.flush();
ts.commit();
第二种
public Admin updateAdminById(int id, String status)
Session session=HibernateUtil.getSession();
ts=session.beginTransaction();
Admin admin=(User)session.get(Admin.class, id);
admin.setStatus(status);
ts.commit();
return admin;
参考技术D 用Query接口来写HQL
利用Entity Framework修改指定字段中的值
利用Entity Framework修改指定字段中的值一般我们编辑某些模型的时候会用到类似这样的代码:
[HttpPost] public ActionResult Edit(Article model) { if (model.Id == 0) { return HttpNotFound(); } using (db) { db.Entry(model).State = EntityState.Modified; db.SaveChanges(); } return RedirectToAction("Index"); }
这样的代码完全能够符合我们的要求,能够顺利的修改我们想要修改的数据。
但是其中却有一个问题:例如说文章的创建时间字段Create_Time
是由文章创建的时候生成的,其值不应该随着文章的编辑而变化,为了使这个值不变,我们就需要在前台的html代码里加上一个隐藏的name属性为Create_Time的input并且设置其值为文章的创建时间。这样做也能成功但是不保险,如果编辑人员有能力修改input里的值的话还是能够修改数据库中的数据的。所以我们应该从代码的层面上来解决这个问题。
再举个例子,用户在修改密码的时候我们只希望单单的修改密码字段,而不需要将原来的用户模型全都加载进来,然后再修改密码,再保存。这样做感觉上是已经多走了好多的路。
而如果我们直接手写sql语句的话我们可以直接执行SQL语句:
update userinfo set password = ‘123456‘
很显然如果我们类似使用dbContext的执行sql语句就有点本末倒置了:
db.Database.ExecuteSqlCommand("update userinfo set password = ‘123456‘");
解决办法
使用类似下列代码:也就是只设置模型的某些特定的字段来告诉EF我们希望修改哪些字段。
public ActionResult TestEdit(int id=0) { var model = new Article {Id = id, Title = $"after edit!current time: {DateTime.Now}"}; db.Article.Attach(model); db.Entry(model).Property(x => x.Title).IsModified = true; db.SaveChanges(); return RedirectToAction("Index"); }
上述代码只修改了文章的标题,而其他字段并没有做任何的修改,整个修改过程也没涉及到任何的读取数据库操作。这样的修改显然要更加合理。
以上是关于用hibernate怎么修改指定字段的值的主要内容,如果未能解决你的问题,请参考以下文章
运行第二天出现hibernate的错误,org.hibernate.TransactionException: JDBC commit failed at org.hiber
spring boot 中Spring data jpa数据库表字段命名策略