package edu.sjtu.infosec.ismp.security; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.Hibernate; import org.hibernate.Query; import org.springframework.stereotype.Component; import org.springside.modules.orm.hibernate.HibernateDao; @Component public class UserDao extends HibernateDao<User, String> { private static final String QUERY_USER_WITH_ROLE = "select u from User u left join fetch u.roleList order by u.id"; private static final String COUNT_USERS = "select count(u) from User u"; private static final String DISABLE_USERS = "update User u set u.status='disabled' where id in(:ids)"; private static final String QUERY_All_DOMAIN = "select d from Domain d"; private static final String QUERY_CASECADE_DOMIN = "select d from Domain d where d.parentDomain =:fDomain"; /** * 批量修改用户状态. */ public void disableUsers(List<String> ids) { Map<String, List<String>> map = Collections.singletonMap("ids", ids); batchExecute(UserDao.DISABLE_USERS, map); } /** * 使用 HQL 预加载lazy init的List<Role>,用DISTINCE_ROOT_ENTITY排除重复数据. */ @SuppressWarnings("unchecked") public List<User> getAllUserWithRoleByDistinctHql() { Query query = createQuery(QUERY_USER_WITH_ROLE); return distinct(query).list(); } /** * 使用Criteria 预加载lazy init的List<Role>, 用DISTINCE_ROOT_ENTITY排除重复数据. */ @SuppressWarnings("unchecked") public List<User> getAllUserWithRolesByDistinctCriteria() { Criteria criteria = createCriteria().setFetchMode("roleList", FetchMode.JOIN); return distinct(criteria).list(); } /** * 统计用户数. */ public Long getUserCount() { return findUnique(UserDao.COUNT_USERS); } /** * 初始化User的延迟加载关联roleList. */ public void initUser(User user) { Hibernate.initialize(user.getRoles()); } /** * 查询所有域信息 */ @SuppressWarnings("unchecked") public List<Domain> getAllDomain() { Query query = createQuery(QUERY_All_DOMAIN); return distinct(query).list(); } /** * 查询域及其子域信息 * @param set */ @SuppressWarnings("unchecked") public List<Domain> getCasecadeDomain(Set<Domain> set) { if(set!=null&&set.size()!=0){ List result = new ArrayList(set); // result.addAll(); for(Domain domain:set){ List qr = getDomianByParent(domain,result); result.addAll(qr); } return result; } return null; } /** * 递归查询子域信息 * @param set */ @SuppressWarnings("unchecked") private List<Domain> getDomianByParent(Domain domain,List result){ Query query = createQuery(QUERY_CASECADE_DOMIN); query.setParameter("fDomain", domain); List<Domain> pr = distinct(query).list(); if(pr!=null&&pr.size()!=0){ result.addAll(pr); for(Domain yu:pr){ List<Domain> anore = getDomianByParent(yu,result); result.addAll(anore); } } return result; } }