4

我正在使用 Struts2+Hibernate 并通过网络示例进行了理解。在此处的示例之一中struts2+hibernate 示例

我可以看到并做的是,通过他们的 删除用户id,正如我们在那里看到的那样,为列表中的每个用户提供了一个删除链接,并session.delete()删除了记录id。现在我希望用户在给定的文本字段中输入名称,并且应该能够按名称删除。到目前为止,我已经尝试过这样

行动方法:

public String delete()
{
    //HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get( ServletActionContext.HTTP_REQUEST);
    //userDAO.delUser(Long.parseLong( request.getParameter("id")));
            userDAO.delUser(user.getName());
    return SUCCESS;
}

DAOImpl:

@Override
public void delUser(String userName) {
    try {
        User user = (User) session.get(User.class, userName);
        session.delete(user);
    } catch (Exception e) {
        transaction.rollback();
        e.printStackTrace();
    } 
}

我希望 Hibernate 可以通过提供的任何字段值删除一行。以上没有任何作用。

4

4 回答 4

6

为什么不简单地使用 JPQL 删除查询?这将不需要休眠从数据库中恢复任何对象以简单地删除它。以下是如何在不先从数据库加载用户的情况下按名称删除用户:

    Query query = em.createQuery("delete from User where name=:name");
    query.setParameter("name", "Zigi");
    int deleted = query.executeUpdate();
    System.out.println("Deleted: " + deleted + " user(s)");
于 2013-03-20T21:06:21.920 回答
5

Hibernate 的问题是您无法通过某些属性值获取持久性实例,只能通过id. 如果你想通过userName试试这个来找到一个实例

public static final String USER_NAME = "userName";

private List<User> findByProperty(String propertyName, Object value) {
    log.debug("finding User instance with property: " + propertyName    + ", value: " + value);
    try {
        String queryString = "from User as model where model." + propertyName   + "= ?";
        Query queryObject = getSession().createQuery(queryString);
        queryObject.setParameter(0, value);
        return queryObject.list();
    } catch (RuntimeException re) {
        log.error("find by property name failed", re);
        throw re;
    }
}

public List<User> findByUserName(Object userName) {
    return findByProperty(USER_NAME, userName);
}

@Override
public void deleteUsers(String userName) {
  try {
    List<User> list = findByUserName(userName);
    for (User user: list)
      getSession().delete(user);
    log.debug("delete successful");
  } catch (RuntimeException re) {
    log.error("delete failed", re);
    throw re;
  }
}  

这将删除具有给定名称的所有用户,删除唯一用户确保该user_name字段具有唯一约束。可以通过表格上的注释来完成

@Table(name = "user", uniqueConstraints = {
        @UniqueConstraint(columnNames = "user_name")
})
于 2013-03-21T10:26:26.287 回答
1

您必须编写一个查询来获取用户userName

例如

String qStr = "from User user where user.userName = :userName";
//then run the query to get the user
Query q = session.createQuery(qStr);
q.setParameter("userName", userName);
List<User> users = (List<User>) q.list();
//if the list is not empty, then users.get(0) will give you the object
于 2013-03-20T20:28:08.700 回答
0
public void deleteUser(Integer id)
{
    session = sessionfactory.openSession();
    tx = session.beginTransaction();
    try
    {           
        Query q=session.createQuery("delete from UserValidateLogin where userId=:userId");  
        q.setParameter("userId",id);  

        q.executeUpdate();    
        tx.commit();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        session.close();
    }

} 
于 2018-10-29T07:06:59.410 回答