/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * dclarke - Dynamic Persistence * http://wiki.eclipse.org/EclipseLink/Development/Dynamic * (https://bugs.eclipse.org/bugs/show_bug.cgi?id=200045) * mnorman - tweaks to work from Ant command-line, * get database properties from System, etc. * ******************************************************************************/ package org.eclipse.persistence.testing.tests.jpa.dynamic.employee; //javase imports import java.util.Collection; import java.util.List; //java eXtension imports import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Query; //JUnit4 imports import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; //EclipseLink imports import org.eclipse.persistence.config.QueryHints; import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.dynamic.DynamicEntity; import org.eclipse.persistence.expressions.ExpressionBuilder; import org.eclipse.persistence.jpa.JpaHelper; import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper; import org.eclipse.persistence.queries.ReadAllQuery; import org.eclipse.persistence.sessions.server.Server; //domain-specific (testing) imports import org.eclipse.persistence.testing.tests.jpa.dynamic.DynamicTestHelper; import static org.eclipse.persistence.testing.tests.jpa.dynamic.DynamicTestHelper.DYNAMIC_PERSISTENCE_NAME; public class EmployeeQueriesTestSuite { //test fixtures static EntityManagerFactory emf = null; static JPADynamicHelper helper = null; static Server serverSession = null; static DynamicEmployeeSystem deSystem = null; @BeforeClass public static void setUp() throws Exception { emf = DynamicTestHelper.createEMF(DYNAMIC_PERSISTENCE_NAME); helper = new JPADynamicHelper(emf); deSystem = DynamicEmployeeSystem.buildProject(helper); serverSession = JpaHelper.getServerSession(emf); deSystem.populate(helper, emf.createEntityManager()); } @AfterClass public static void tearDown() { try{ serverSession.executeNonSelectingSQL("DELETE FROM D_PROJ_EMP"); serverSession.executeNonSelectingSQL("DELETE FROM D_PHONE"); serverSession.executeNonSelectingSQL("DELETE FROM D_SALARY"); serverSession.executeNonSelectingSQL("DELETE FROM D_PROJECT"); serverSession.executeNonSelectingSQL("DELETE FROM D_EMPLOYEE"); serverSession.executeNonSelectingSQL("DELETE FROM D_ADDRESS"); serverSession.executeNonSelectingSQL("DROP TABLE D_SALARY"); serverSession.executeNonSelectingSQL("DROP TABLE D_PROJ_EMP"); serverSession.executeNonSelectingSQL("DROP TABLE D_PROJECT"); serverSession.executeNonSelectingSQL("DROP TABLE D_PHONE"); serverSession.executeNonSelectingSQL("DROP TABLE D_EMPLOYEE"); serverSession.executeNonSelectingSQL("DROP TABLE D_ADDRESS"); } catch (Exception e){ e.printStackTrace(); } helper = null; emf.close(); emf = null; } @Test public void readAllEmployees_JPQL() { EntityManager em = emf.createEntityManager(); List<DynamicEntity> emps = readAllEmployeesUsingJPQL(em); deSystem.assertSame(emps); } @Test public void joinFetchJPQL() { List<DynamicEntity> emps = joinFetchJPQL(emf.createEntityManager()); assertNotNull(emps); } @Test public void joinFetchHint() { List<DynamicEntity> emps = joinFetchHint(emf.createEntityManager()); assertNotNull(emps); } @Test public void minEmployeeId() { int minId = minimumEmployeeId(emf.createEntityManager()); assertTrue(minId > 0); } @Test public void testGenderIn(){ List<DynamicEntity> emps = findEmployeesUsingGenderIn(emf.createEntityManager()); assertNotNull(emps); } @Test public void testReadAllExressions() { List<DynamicEntity> emps = findUsingNativeReadAllQuery(emf.createEntityManager()); assertNotNull(emps); } public List<DynamicEntity> readAllEmployeesUsingJPQL(EntityManager em) { return em.createQuery("SELECT e FROM Employee e ORDER BY e.id ASC").getResultList(); } public List<DynamicEntity> joinFetchJPQL(EntityManager em) { return em.createQuery("SELECT e FROM Employee e JOIN FETCH e.address " + "ORDER BY e.lastName ASC, e.firstName ASC").getResultList(); } public List<DynamicEntity> joinFetchHint(EntityManager em) { Query query = em.createQuery( "SELECT e FROM Employee e WHERE e.manager.address.city = 'Ottawa' " + "ORDER BY e.lastName ASC, e.firstName ASC"); query.setHint(QueryHints.FETCH, "e.address"); query.setHint(QueryHints.FETCH, "e.manager"); query.setHint(QueryHints.FETCH, "e.manager.address"); query.setHint(QueryHints.BATCH, "e.manager.phoneNumbers"); List<DynamicEntity> emps = query.getResultList(); for (DynamicEntity emp : emps) { emp.<DynamicEntity>get("manager").<Collection>get("phoneNumbers").size(); } return emps; } public static int minimumEmployeeId(EntityManager em) { return ((Number)em.createQuery("SELECT MIN(e.id) FROM Employee e") .getSingleResult()).intValue(); } public DynamicEntity minimumEmployee(EntityManager em) { Query q = em.createQuery( "SELECT e FROM Employee e WHERE e.id in (SELECT MIN(ee.id) FROM Employee ee)"); return (DynamicEntity)q.getSingleResult(); } public List<DynamicEntity> findEmployeesUsingGenderIn(EntityManager em) { return em.createQuery("SELECT e FROM Employee e WHERE e.gender IN " + "(:GENDER1, :GENDER2)") .setParameter("GENDER1", "Male") .setParameter("GENDER2", "Female") .getResultList(); } public List<DynamicEntity> findUsingNativeReadAllQuery(EntityManager em) { ClassDescriptor descriptor = serverSession.getDescriptorForAlias("Employee"); ReadAllQuery raq = new ReadAllQuery(descriptor.getJavaClass()); ExpressionBuilder eb = raq.getExpressionBuilder(); raq.setSelectionCriteria(eb.get("gender").equal("Male")); Query query = JpaHelper.createQuery(raq, em); return query.getResultList(); } public DynamicEntity minEmployeeWithAddressAndPhones(EntityManager em) { return (DynamicEntity)em.createQuery( "SELECT e FROM Employee e JOIN FETCH e.address WHERE e.id IN " + "(SELECT MIN(p.id) FROM PhoneNumber p)") .getSingleResult(); } }