我有以下表格用于在MySQL中存储我的博文:
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| PostID | int(11) | NO | PRI | NULL | auto_increment |
| PostTitle | varchar(250) | YES | | NULL | |
| PostDate | datetime | YES | | NULL | |
| OwnerID | int(11) | YES | MUL | NULL | |
| PostVote | int(11) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
我想使用hibernate UPDATE查询仅更新PostVote
。
这是我的JAVA方法:
@PUT
@Consumes({ MediaType.APPLICATION_JSON })
public void updateVotes (Posts p) {
Session ses = HibernateUtil.currentSession();
Transaction tx = null;
try{
tx =ses.beginTransaction();
ses.createQuery("UPDATE Posts SET PostVote="+p.getPostVote() +" WHERE PostID="+p.getPostID()+" AND OwnerID="+p.getOwnerID());
ses.update(p);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
HibernateUtil.closeSession();
}
}
我在帖子P (Post ID,PostVote,OwnerID)
中只使用3个参数调用此方法,因为这些是我查询所需的唯一参数。
但是,一旦执行了查询,除了这3个值之外,所有其他值都将设置为NULL。
这是hibernate查询输出:
Hibernate: update posts set PostTitle=?, PostDate=?, OwnerID=?, PostVote=? where PostID=?
这显然不会很好,因为它似乎更新了不需要的元素。有什么建议在我的实际查询中可能出错吗?
答案 0 :(得分:0)
使用dynamic-update=true
点击此链接可能对您有所帮助
http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/
答案 1 :(得分:0)
我通过修改我的代码解决了这个问题,如下所示:
try{
tx =ses.beginTransaction();
Posts p2 = new Posts();
**p2 = (Posts)ses.get(Posts.class, p.getPostID());**
p2.setPostID(p.getPostID());
p2.setPostVote(p.getPostVote());
p2.setOwnerID(p.getOwnerID());
// ses.createQuery("UPDATE Posts SET PostVote="+p.getPostVote() +" WHERE PostID="+p.getPostID()+" AND OwnerID="+p.getOwnerID());
ses.update(p2);
tx.commit();
}
以上代码的重要变化如下:
p2 = (Posts)ses.get(Posts.class, p.getPostID());
在这种情况下,Hibernate查询仍然相同,即:
Hibernate: update posts set PostTitle=?, PostDate=?, OwnerID=?, PostVote=? where PostID=?
然而,由于我已根据PostID获取帖子,因此Post P的所有元素现在都具有有效值。我现在可以修改所需的并在数据库中更新整个Post。
我还试过在我的XML映射文件中添加dynamic-update="true"
。但请注意,如果我们首先使用only
获取帖子,即使它会有效session.get(Classname.class, id)
。它只是对hibernate查询产生了以下不同:
Hibernate: update posts set PostVote=? where PostID=?
结论:
dynamic-update="true"
。但是,Hibernate对数据库的查询会有所不同。