/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.common.query.jpa; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Path; import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionConfiguration; import org.springframework.transaction.annotation.Transactional; import com.ewcms.common.query.model.Certificate; import com.ewcms.common.query.model.LimitLog; /** * * @author wangwei */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:com/ewcms/common/query/applicationContext.xml"}) @TransactionConfiguration(transactionManager = "txManager", defaultRollback = false) @Transactional public class EntityQueryTemplateTest { @Autowired private EntityManagerFactory entityManagerFactory; @Autowired private QueryInit entityQueryInit; private EntityQueryTemplate template; @Before public void before()throws IOException{ template = new EntityQueryTemplate(entityManagerFactory.createEntityManager(),Certificate.class); entityQueryInit.initDatabase(); } @Test public void testGet() { Path<?> path = template.get("limitLogs.date"); Assert.assertNotNull(path); } @Test public void testEq() { template.eq("id", "72300125"); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 1); Assert.assertEquals(((Certificate)list.get(0)).getName(), "王伟"); } @Test public void testNotEq() { template.notEq("id", "72300125"); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 159); } @Test public void testGt() { template.gt("limit", 3000); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 13); } @Test public void testGe() { template.ge("limit", 3000); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 18); } @Test public void testLt() { template.lt("limit", 3000); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 142); } @Test public void testLe() { template.le("limit", 3000); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 147); } @Test public void testLikeStart() { template.likeStart("name", "王"); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 6); } @Test public void testLikeEnd() { template.likeEnd("name", "伟"); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 4); } @Test public void testLikeAny() { template.likeAnywhere("name", "伟"); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 4); } private Date getDate(int year, int month, int day) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month, day); return new Date(calendar.getTimeInMillis()); } @Test public void testBetween() { Date start = getDate(1969, 11, 31); Date end = getDate(1980, 0, 1); template.between("brithdate", start, end); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 31); } @Test public void testIn() { List<String> names = new ArrayList<String>(); names.add("王伟"); names.add("周冬初"); template.in("name", names); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 2); } @Test public void testIsNull() { template.isNull("name"); List<Object> list = template.getResultList(); Assert.assertTrue(list.isEmpty()); } @Test public void testIsNotNull() { template.isNotNull("name"); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 160); } @Test public void testAnd() { template.eq("name", "王伟").and(template.eq("id", "72300125")); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 1); } @Test public void testOr() { template.eq("name", "王伟").or(template.eq("name", "周冬初")); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 2); } @Test public void testComplex() { template.eq("name", "周冬初").or(template.eq("name", "王伟").and(template.eq("id", "72300125"))); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 2); } @Test public void testNot() { template.not(template.likeEnd("name", "伟")); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 156); } @Test public void testCompoundAnd() { template.eq("id", "72300125").eq("name", "王伟"); List<Object> list = template.getResultList(); Assert.assertEquals(list.size(), 1); } @Test public void testCompoundOr(){ template.eq("id", "72300126").eq("name", "王伟").or(); List<Object> list = template.getResultList(); Assert.assertEquals(list.size(), 2); } @Test public void testOrderAsc() { template.orderAsc("id"); List<Object> list = template.getResultList(); int first_id = Integer.valueOf(((Certificate)list.get(0)).getId()); int second_id = Integer.valueOf(((Certificate)list.get(2)).getId()); int end_id = Integer.valueOf(((Certificate)list.get(list.size() - 1)).getId()); Assert.assertTrue(end_id > second_id); Assert.assertTrue(second_id > first_id); } @Test public void testOrderDesc() { template.orderDesc("id"); List<Object> list = template.getResultList(); int first_id = Integer.valueOf(((Certificate)list.get(0)).getId()); int second_id = Integer.valueOf(((Certificate)list.get(2)).getId()); int end_id = Integer.valueOf(((Certificate)list.get(list.size() - 1)).getId()); Assert.assertTrue(first_id > second_id); Assert.assertTrue(second_id > end_id); } @Test public void testStartPosition(){ template.setFirstResult(100); List<Object> list = template.getResultList(); Assert.assertTrue(list.size() == 60); } @Test public void testMaxResults(){ template.setMaxResults(20); List<Object> list = template.getResultList(); Assert.assertEquals(20, list.size()); } @Test public void testStartPositionAndMaxResults(){ List<Object> list = template .setFirstResult(150) .setMaxResults(20) .getResultList(); Assert.assertTrue(list.size() == 10); } @Test public void testLimitLogs(){ Date start = getDate(2007, 0, 1); Date end = getDate(2007, 0, 10); EntityQueryTemplate joinTemplate = new EntityQueryTemplate(entityManagerFactory.createEntityManager(),LimitLog.class); joinTemplate.eq("certificate.name", "李沐华"); joinTemplate.between("date", start,end); List<Object> list = joinTemplate.getResultList(); Assert.assertTrue(list.size()==3); } @Test public void testSelectCallback(){ Long count =(Long)template.select(new SelectCallback(){ @Override public Selection<?> select(CriteriaBuilder builder, Root<?> root) { return builder.count(root.get("id")); } }).getResultSingle(); Assert.assertTrue(count == 160); } @Test public void testExecute(){ List<Object[]> list = template.execute(new QueryTemplateCallback<List<Object[]>>(){ @Override public List<Object[]> doInQuery(EntityManager em) { Class<?> entityClass= Certificate.class; CriteriaBuilder builder =em.getCriteriaBuilder(); CriteriaQuery<Object[]> criteriaQuery = builder.createQuery(Object[].class); Root<?> root = criteriaQuery.from(entityClass); criteriaQuery.select(builder.array(new Selection[]{root.get("id"),root.get("name")})); criteriaQuery.where(builder.equal(root.get("id"), "72300125")); return em.createQuery(criteriaQuery).getResultList(); } }); Assert.assertTrue(list.size() == 1); Assert.assertTrue(list.get(0).length == 2); } }