package org.springside.modules.unit.orm.hibernate; import static org.junit.Assert.*; import java.util.Collections; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.apache.commons.lang.xwork.StringUtils; import org.hibernate.SessionFactory; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Restrictions; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springside.modules.orm.Page; import org.springside.modules.orm.PropertyFilter; import org.springside.modules.orm.hibernate.HibernateDao; import org.springside.modules.test.spring.SpringTxTestCase; import org.springside.modules.test.utils.DbUnitUtils; import org.springside.modules.unit.orm.hibernate.data.User; import com.google.common.collect.Lists; @ContextConfiguration(locations = { "/applicationContext-core-test.xml" }) public class HibernateDaoTest extends SpringTxTestCase { private HibernateDao<User, Long> dao; @Autowired private SessionFactory sessionFactory; @Before public void setUp() throws Exception { simpleJdbcTemplate.update("drop all objects"); executeSqlScript("classpath:/schema.sql", false); DbUnitUtils.loadData((DataSource) applicationContext.getBean("dataSource"), "/test-data.xml"); dao = new HibernateDao<User, Long>(sessionFactory, User.class); } @Test public void getAll() { //初始化数据中共有6个用户 Page<User> page = new Page<User>(5); dao.getAll(page); assertEquals(5, page.getResult().size()); //自动统计总数 assertEquals(6L, page.getTotalCount()); page.setPageNo(2); dao.getAll(page); assertEquals(1, page.getResult().size()); } @Test public void findByHQL() { //初始化数据中共有6个email为@springside.org.cn的用户 Page<User> page = new Page<User>(5); dao.findPage(page, "from User u where email like ?", "%springside.org.cn%"); assertEquals(5, page.getResult().size()); //自动统计总数 assertEquals(6L, page.getTotalCount()); //翻页 page.setPageNo(2); dao.findPage(page, "from User u where email like ?", "%springside.org.cn%"); assertEquals(1, page.getResult().size()); //命名参数版本 Map<String, String> paraMap = Collections.singletonMap("email", "%springside.org.cn%"); page = new Page<User>(5); dao.findPage(page, "from User u where email like :email", paraMap); assertEquals(5, page.getResult().size()); //自动统计总数 assertEquals(6L, page.getTotalCount()); //翻页 page.setPageNo(2); dao.findPage(page, "from User u where email like :email", paraMap); assertEquals(1, page.getResult().size()); } @Test public void findByCriterion() { //初始化数据中共有6个email为@springside.org.cn的用户 Page<User> page = new Page<User>(5); Criterion c = Restrictions.like("email", "springside.org.cn", MatchMode.ANYWHERE); dao.findPage(page, c); assertEquals(5, page.getResult().size()); //自动统计总数 assertEquals(6L, page.getTotalCount()); //翻页 page.setPageNo(2); dao.findPage(page, c); assertEquals(1, page.getResult().size()); } @Test public void findByCriterionWithOrder() { //初始化数据中共有6个email为@springside.org.cn的用户 Page<User> page = new Page<User>(5); page.setOrderBy("name,loginName"); page.setOrder(Page.DESC + "," + Page.ASC); Criterion c = Restrictions.like("email", "springside.org.cn", MatchMode.ANYWHERE); dao.findPage(page, c); assertEquals("Sawyer", page.getResult().get(0).getName()); } @Test public void findByProperty() { List<User> users = dao.findBy("loginName", "admin", PropertyFilter.MatchType.EQ); assertEquals(1, users.size()); assertEquals("admin", users.get(0).getLoginName()); users = dao.findBy("email", "springside.org.cn", PropertyFilter.MatchType.LIKE); assertEquals(6, users.size()); assertTrue(users.get(0).getEmail().indexOf("springside.org.cn") != -1); } @Test public void findByFilters() throws Exception { List<PropertyFilter> filters; //EQ filter PropertyFilter eqFilter = new PropertyFilter("EQS_loginName", "admin"); filters = Lists.newArrayList(eqFilter); List<User> users = dao.find(filters); assertEquals(1, users.size()); assertEquals("admin", users.get(0).getLoginName()); //LIKE filter and OR PropertyFilter likeAndOrFilter = new PropertyFilter("LIKES_email_OR_loginName", "springside.org.cn"); filters = Lists.newArrayList(likeAndOrFilter); users = dao.find(filters); assertEquals(6, users.size()); assertTrue(StringUtils.contains(users.get(0).getEmail(), "springside.org.cn")); //Filter with Page Page<User> page = new Page<User>(5); dao.findPage(page, filters); assertEquals(5, page.getResult().size()); assertEquals(6L, page.getTotalCount()); page.setPageNo(2); dao.findPage(page, filters); assertEquals(1, page.getResult().size()); //Date and LT/GT filter PropertyFilter dateLtFilter = new PropertyFilter("LTD_createTime", "2046-01-01"); filters = Lists.newArrayList(dateLtFilter); users = dao.find(filters); assertEquals(6, users.size()); PropertyFilter dateGtFilter = new PropertyFilter("GTD_createTime", "2046-01-01 10:00:22"); filters = Lists.newArrayList(dateGtFilter); users = dao.find(filters); assertEquals(0, users.size()); } @Test public void findPageByHqlAutoCount() { Page<User> page = new Page<User>(5); dao.findPage(page, "from User user"); assertEquals(6L, page.getTotalCount()); dao.findPage(page, "select user from User user"); assertEquals(6L, page.getTotalCount()); dao.findPage(page, "select user from User user order by id"); assertEquals(6L, page.getTotalCount()); } }