通过任何列值hibernate删除记录

Aad*_*dam 4 java hibernate struts2 java-ee

我是hibernate的新手,我正在学习struts2 + hibernate并且已经通过网络上的例子进行了解.在其中一个示例中这里是strts2 + hibernate示例

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

ActionMethod:

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;
}
Run Code Online (Sandbox Code Playgroud)

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();
    } 
}
Run Code Online (Sandbox Code Playgroud)

我希望hibernate可以通过提供的任何字段值删除行.以上什么都不做.

问候

Mar*_*hut 6

为什么不简单地使用JPQL删除查询?这不需要hibernate从DB恢复任何对象到简单删除它.以下是如何在不首先从DB加载的情况下按名称删除用户:

    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)");
Run Code Online (Sandbox Code Playgroud)


Rom*_*n C 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;
  }
}  
Run Code Online (Sandbox Code Playgroud)

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

@Table(name = "user", uniqueConstraints = {
        @UniqueConstraint(columnNames = "user_name")
})
Run Code Online (Sandbox Code Playgroud)