Hibernate的HQL与删除和(Hibernate HQL delete with and)

2019-08-03 00:48发布

Hibernate不删除我行:

public boolean deleteVote(Login user, int pid){

      Session session = getSession();

      try{
          String hql = "delete from Vote where uid= :uid AND pid= :pid";
          Query query = session.createQuery(hql);
          System.out.println(user.getUid() + " and pid: " + pid);
          query.setString("uid", user.getUid());
          query.setInteger("pid", pid);
          System.out.println(query.executeUpdate());
      }catch(Exception e){

Outprint:

uid: 123 and pid: 1
Hibernate: delete from votes where uid=? and pid=?
1

当我在SQL直接尝试SQL语法工作。 直接的SQL语法:

 delete from votes where uid= '123' AND pid= 1

制图:

<class name="package.model.Vote" table="votes">
   <id name="vid" column="vid" >
   <generator class="increment"/>
</id>
<property name="pid" column="pid" />
<property name="uid" column="uid" />
<property name="tid" column="tid" />
<property name="votes" column="votes" />
 </class>

表:

CREATE TABLE IF NOT EXISTS `votes` (
  `vid` int(11) NOT NULL 
  `pid` int(11) NOT NULL,
  `uid` varchar(20) NOT NULL,
  `tid` int(11) NOT NULL,
  `votes` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`vid`),
  KEY `pcid` (`pid`,`uid`),
  KEY `uid` (`uid`),
  KEY `tid` (`tid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;

ALTER TABLE `votes`
ADD CONSTRAINT `votes_ibfk_3` FOREIGN KEY (`pid`) REFERENCES `poll` (`pid`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `votes_ibfk_4` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON     UPDATE CASCADE,
ADD CONSTRAINT `votes_ibfk_5` FOREIGN KEY (`tid`) REFERENCES `teams` (`tid`) ON DELETE CASCADE ON UPDATE CASCADE;

INSERT INTO `votes` (`vid`, `pid`, `uid`, `tid`, `votes`) VALUES
(20, 1, '123', 1, 1);

我想这件事情很容易,因为一切看起来都正常,我那么远。 我没有错误或其他任何东西,只是没有删除正在发生的事情。

任何帮助表示赞赏。

Answer 1:

你需要开始和提交事务。

Transaction transaction = session.beginTransaction();
try {
  // your code
  String hql = "delete from Vote where uid= :uid AND pid= :pid";
  Query query = session.createQuery(hql);
  System.out.println(user.getUid() + " and pid: " + pid);
  query.setString("uid", user.getUid());
  query.setInteger("pid", pid);
  System.out.println(query.executeUpdate());
  // your code end

  transaction.commit();
} catch (Throwable t) {
  transaction.rollback();
  throw t;
}

这也有可能是你需要关闭会话之前的变化将在数据库中可见。



Answer 2:

从输出你提供

uid: 123 and pid: 1
Hibernate: delete from votes where uid=? and pid=?
1

很显然, query.executeUpdate()是返回1.该方法返回更新或删除的实体的数目。 这意味着,1行已被更新或删除,这是好的。

尝试做一个session.flush()以冲洗会话,或session.evict()以从会话中删除该对象。



Answer 3:

entityManager.createQuery( “DELETE FROM表名”)的executeUpdate();



文章来源: Hibernate HQL delete with and