Hibernate 多表查询、新增、删除

有这么两个表:User和Role,一个UserID可能对应多个RoleID,它俩之间通过UserRole连接

//查询方法

@Override
    public List<Role> queryRoleAllByUserID(long userid) {
        Session session = HibernateUtils.getSession();
        User user= (User) session.get(User.class, userid);
        Set<UserRole> set=user.getUserRoles();   
        List<Role> list=new ArrayList<Role>();    
        for (UserRole userRole : set) {         
            list.add(userRole.getRole());         
        }
        return list;
    }

可以倒着这么想:

  最后我是要得到Role的,那么和role有关系的是哪个呢?UseRole

  所以接着我要得到UserRole,那么通过User可以得到UserRole

  传参过来的是UserID,所以得到User就很容易了。


//新增方法(给用户添加角色)

    可以理解成新添加一条用户角色信息,只不过是指定了某一用户,某些角色

@Override
    public boolean addRole(long userid,List<Long> roles) {
        boolean flag = false;
        Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();    
        User u=(User) session.get(User.class, userid);    
        for(Long i:roles){        
            Role role=(Role) session.get(Role.class, i);
            //u.getUserRoles().add(new UserRole(role, u));   ---这是间接添加方式
            long id = (long) session.save(new UserRole(role, u));
            if(id>0)
            {
                flag = true;
            }
        }
        tx.commit();
        return flag;
}

@Test
    public void TestAdd(){
        List<Long> list = new ArrayList<Long>();
        list.add(1l);
        list.add(2l);
        System.out.println(ur.addRole(3l, list));
    }

//删除方法----这个方法就比较简单了,通过UserID直接可以查找到用户角色,之后进行删除操作

@Override
    public boolean deleteRoleByID(long userid) {
        boolean flag = false;
        Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();    
        
        String hql = "from UserRole where userid = :userid ";
        
        List<UserRole> list =  session.createQuery(hql).setLong("userid", userid).list();
        if(list.size()!=0){
            for (UserRole ur : list) {
                session.delete(ur);
                flag = true;
            }
        }

        tx.commit();
        return flag;
    }

小技巧:先写等号右边的,然后判断返回是啥类型呦!

原文地址:https://www.cnblogs.com/zmlion1995/p/5787640.html