package org.springside.examples.showcase.common.dao; import java.util.Collections; import java.util.List; import java.util.Map; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.Query; import org.springframework.stereotype.Component; import org.springside.examples.showcase.common.entity.User; import org.springside.modules.orm.hibernate.HibernateDao; /** * 用户对象的泛型Hibernate Dao. * * @author calvin */ @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)"; /** * 批量修改用户状态. */ 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) { initProxyObject(user.getRoleList()); } }