MyEntity m = (MyEntity) session.get(MyEntity.class, "001");
m.setValue(m.getValue() + 10);
// and the new value will automatically be written to database at flush time
//id of employee that you want to update
int updatedEmployeeID = 6;
//exact employee that you want to update
Employee updateEmployee = session.get(Employee.class, updatedEmployeeID);
//for debug to see is that exact data that you want to update
System.out.println("Employee before update: "+updateEmployee);
//basically we use setter to update from the @Entity class
updateEmployee.setCompany("Arthur House");
//commit
session.getTransaction().commit();
6条答案
按热度按时间iqxoj9l91#
使用HQL来做这件事是没有意义的,如果你想这样做,你可以使用直接的SQL,通过一个JDBC查询(或者甚至通过一个Hibernate查询,你也可以使用SQL查询)。
建议仅在执行批处理更新时使用HQL查询进行更新,而不是单行。Http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-direct
一种更面向对象的方法是使用HQL加载您的对象,在Java世界中执行您需要做的事情(ColumnValue+=10,无论您还需要做什么),然后使用Hibernate会话刷新将其持久化。
我认为它涉及更多的操作,因此效率较低(在纯性能方面),但这取决于您的Hibernate配置(缓存、集群、二级缓存等)。它可以做得更好。当然,更不用说更好的测试了。
cld4siwp2#
正如其他人所说,有更好的方法,但如果你真的必须这样做,那么例如使用以下语法:
qf9go6mv3#
除了Adam Batkin的回答之外,我想补充的是,在Hibernate中通常不会使用这样的查询(除非您需要一次修改整个行)。Hibernate的目标是处理对象。因此,您通常会这样做:
mmvthczy4#
HQL查询应该看起来非常相似,除了不使用表名和列名之外,应该使用实体名和属性名(即,无论您在Java中使用什么)。
rta7y2nd5#
请试一下这件。
关于Lavanyavath.Bharathidhasan
jfgube3f6#
HQL将在这里帮助您将对象带给您,并提供您可以轻松更新的会话帮助。