blob: 7f11462e00bbd062dc829778e186d8f2aa0131ef [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.jpa.jpql;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.math.BigDecimal;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import junit.framework.TestCase;
import org.junit.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.persistence.config.QueryHints;
import org.eclipse.persistence.exceptions.JPQLException;
import org.eclipse.persistence.expressions.Expression;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.expressions.ExpressionMath;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.platform.database.DatabasePlatform;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.ReadObjectQuery;
import org.eclipse.persistence.queries.ReportQuery;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.sessions.server.Server;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.advanced.Address;
import org.eclipse.persistence.testing.models.jpa.advanced.AdvancedTableCreator;
import org.eclipse.persistence.testing.models.jpa.advanced.Employee;
import org.eclipse.persistence.testing.models.jpa.advanced.EmployeePopulator;
import org.eclipse.persistence.testing.models.jpa.advanced.LargeProject;
import org.eclipse.persistence.testing.models.jpa.advanced.PhoneNumber;
import org.eclipse.persistence.testing.models.jpa.advanced.Project;
import org.eclipse.persistence.testing.models.jpa.advanced.SmallProject;
/**
* <p>
* <b>Purpose</b>: Test simple EJBQL functionality.
* <p>
* <b>Description</b>: This class creates a test suite, initializes the database
* and adds tests to the suite.
* <p>
* <b>Responsibilities</b>:
* <ul>
* <li> Run tests for simple EJBQL functionality
* </ul>
* @see org.eclipse.persistence.testing.models.jpa.advanced.EmployeePopulator
* @see JUnitDomainObjectComparer
*/
public class JUnitJPQLSimpleTestSuite extends JUnitTestCase {
static JUnitDomainObjectComparer comparer; //the global comparer object used in all tests
public JUnitJPQLSimpleTestSuite() {
super();
}
public JUnitJPQLSimpleTestSuite(String name) {
super(name);
}
//This method is run at the end of EVERY test case method
@Override
public void tearDown() {
clearCache();
}
//This suite contains all tests contained in this class
public static Test suite() {
TestSuite suite = new TestSuite();
suite.setName("JUnitJPQLSimpleTestSuite");
suite.addTest(new JUnitJPQLSimpleTestSuite("testSetup"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleSingleArgSubstringTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleJoinFetchTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleJoinFetchTest2"));
suite.addTest(new JUnitJPQLSimpleTestSuite("baseTestCase"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleABSTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleBetweenTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleConcatTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleConcatTestWithParameters"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleConcatTestWithConstantsLiteralSecond"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleConcatTestWithConstantsLiteralFirst"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleThreeArgConcatTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleDistinctTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleDistinctNullTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleDistinctMultipleResultTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleDoubleOrTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleEqualsBracketsTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleEqualsTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleEqualsTestWithJoin"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleEqualsWithAs"));
suite.addTest(new JUnitJPQLSimpleTestSuite("collectionMemberIdentifierEqualsTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("abstractSchemaIdentifierEqualsTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("abstractSchemaIdentifierNotEqualsTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleInOneDotTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleInTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleInListTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleInNegativeTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLengthTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLikeTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLikeTestWithParameter"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLikeEscapeTestWithParameter"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleNotBetweenTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleNotEqualsVariablesInteger"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleNotInTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleNotLikeTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleOrFollowedByAndTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleOrFollowedByAndTestWithStaticNames"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleOrTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleParameterTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleParameterTestChangingParameters"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleReverseAbsTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleReverseConcatTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleReverseEqualsTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleReverseLengthTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleReverseParameterTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleReverseSqrtTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleReverseSubstringTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleSqrtTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleSubstringTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleNullTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleNotNullTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("distinctTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("conformResultsInUnitOfWorkTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleModTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleIsEmptyTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleIsNotEmptyTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleApostrohpeTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleEscapeUnderscoreTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleEnumTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("smallProjectMemberOfProjectsTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("smallProjectNOTMemberOfProjectsTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectCountOneToOneTest")); //bug 4616218
suite.addTest(new JUnitJPQLSimpleTestSuite("selectOneToOneTest")); //employee.address doesnt not work
suite.addTest(new JUnitJPQLSimpleTestSuite("selectPhonenumberDeclaredInINClauseTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectPhoneUsingALLTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectSimpleMemberOfWithParameterTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectSimpleNotMemberOfWithParameterTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectSimpleNotMemberOfWithParameterNestedTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectDirectCollectionNotMemberTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectDirectCollectionNonMemberNestedTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectSimpleBetweenWithParameterTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectSimpleInWithParameterTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectAverageQueryForByteColumnTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectUsingLockModeQueryHintTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("multipleExecutionOfNamedQueryTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOneEqualsOne"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testParameterEqualsParameter"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleTypeTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleAsOrderByTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLiteralDateTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLiteralLongTest_Long1"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLiteralLongTest_Long2"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLiteralLongTest_Float1"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLiteralLongTest_Float2"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLiteralLongTest_Double1"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleLiteralLongTest_Double2"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleSingleArgSubstringTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("elementCollectionIsNotEmptyTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("relationshipElementCollectionIsNotEmptyTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("enumWithToStringTest"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectFromClauseWithFullyQualifiedClassName"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectFromClauseWithTableName"));
suite.addTest(new JUnitJPQLSimpleTestSuite("selectFromClauseWithJoin"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testMultipleSubqueries"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testDirectCollectionComparison"));
suite.addTest(new JUnitJPQLSimpleTestSuite("simpleQueryWithFirstUnusedEntity"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testSimpleGroupByOrderByClauses"));
// Bug 506512 - Syntax error parsing JPQL with ORDER BY clause, using parentheses
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesAsc"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesDesc"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesCalculatedAsc"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesCalculatedDesc"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesCalculatedAndNormalAsc"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesCalculatedAndNormalDesc"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesCalculatedAndNormalHybrid"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesCalculatedDefault"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesDefault"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesCalculatedAndNormalDefault"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesAllAttributes"));
suite.addTest(new JUnitJPQLSimpleTestSuite("testOrderByWithParenthesesAllAttributesHybrid"));
return suite;
}
/**
* The setup is done as a test, both to record its failure, and to allow execution in the server.
*/
public void testSetup() {
clearCache();
//get session to start setup
DatabaseSession session = JUnitTestCase.getServerSession();
//create a new EmployeePopulator
EmployeePopulator employeePopulator = new EmployeePopulator();
new AdvancedTableCreator().replaceTables(session);
//initialize the global comparer object
comparer = new JUnitDomainObjectComparer();
//set the session for the comparer to use
comparer.setSession((AbstractSession)session.getActiveSession());
//Populate the tables
employeePopulator.buildExamples();
//Persist the examples in the database
employeePopulator.persistExample(session);
}
/**
* Tests 1=1 returns correct result.
*/
public void testParameterEqualsParameter() throws Exception {
DatabasePlatform databasePlatform = JUnitTestCase.getServerSession().getPlatform();
if (databasePlatform.isSymfoware()) {
getServerSession().logMessage("Test testParameterEqualsParameter skipped for this platform, "
+ "Symfoware doesn't allow dynamic parameters on both sides of the equals operator at the same time. (bug 304897)");
return;
}
if (databasePlatform.isMaxDB()) {
getServerSession().logMessage("Test testParameterEqualsParameter skipped for this platform, "
+ "MaxDB doesn't allow dynamic parameters on both sides of the equals operator at the same time. (bug 326962)");
return;
}
EntityManager em = createEntityManager();
beginTransaction(em);
try {
Query query = em.createQuery("SELECT e FROM Employee e");
List<Employee> emps = query.getResultList();
Assert.assertNotNull(emps);
int numRead = emps.size();
query = em.createQuery("SELECT e FROM Employee e WHERE :arg1=:arg2");
query.setParameter("arg1", 1);
query.setParameter("arg2", 1);
emps = query.getResultList();
Assert.assertNotNull(emps);
Assert.assertEquals(numRead, emps.size());
} finally {
rollbackTransaction(em);
closeEntityManager(em);
}
}
/**
* Tests 1=1 returns correct result.
*/
public void testOneEqualsOne() throws Exception {
if ((JUnitTestCase.getServerSession()).getPlatform().isSymfoware()) {
getServerSession().logMessage("Test testOneEqualsOne skipped for this platform, "
+ "Symfoware doesn't allow dynamic parameters on both sides of the equals operator at the same time. (bug 304897)");
return;
}
EntityManager em = createEntityManager();
beginTransaction(em);
try {
Query query = em.createQuery("SELECT e FROM Employee e");
List<Employee> emps = query.getResultList();
Assert.assertNotNull(emps);
int numRead = emps.size();
query = em.createQuery("SELECT e FROM Employee e WHERE 1=1");
emps = query.getResultList();
Assert.assertNotNull(emps);
Assert.assertEquals(numRead, emps.size());
ExpressionBuilder builder = new ExpressionBuilder();
query = ((JpaEntityManager)em.getDelegate()).createQuery(builder.value(1).equal(builder.value(1)), Employee.class);
emps = query.getResultList();
Assert.assertNotNull(emps);
Assert.assertEquals(numRead, emps.size());
} finally {
rollbackTransaction(em);
closeEntityManager(em);
}
}
//GF Bug#404
//1. Fetch join now works with LAZY. The fix is to trigger the value holder during object registration. The test is to serialize
//the results and deserialize it, then call getPhoneNumbers().size(). It used to throw an exception because the value holder
//wasn't triggered and the data was in a transient attribute that was lost during serialization
//2. Test both scenarios of using the cache and bypassing the cache
public void simpleJoinFetchTest() throws Exception {
if (isOnServer()) {
// Not work on server.
return;
}
org.eclipse.persistence.jpa.JpaEntityManager em = (org.eclipse.persistence.jpa.JpaEntityManager)createEntityManager();
simpleJoinFetchTest(em);
}
//bug#6130550:
// tests that Fetch join works when returning objects that may already have been loaded in the em/uow (without the joined relationships)
// Builds on simpleJoinFetchTest
public void simpleJoinFetchTest2() throws Exception {
if (isOnServer()) {
// Not work on server.
return;
}
org.eclipse.persistence.jpa.JpaEntityManager em = (org.eclipse.persistence.jpa.JpaEntityManager)createEntityManager();
//preload employees into the cache so that phonenumbers are not prefetched
String ejbqlString = "SELECT e FROM Employee e";
List result = em.createQuery(ejbqlString).getResultList();
result.size();
// run the simpleJoinFetchTest and verify all employees have phonenumbers fetched.
simpleJoinFetchTest(em);
}
public void simpleJoinFetchTest(org.eclipse.persistence.jpa.JpaEntityManager em) throws Exception {
String ejbqlString = "SELECT e FROM Employee e LEFT JOIN FETCH e.phoneNumbers";
//use the cache
List result = em.createQuery(ejbqlString).getResultList();
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
ObjectOutputStream stream = new ObjectOutputStream(byteStream);
stream.writeObject(result);
stream.flush();
byte arr[] = byteStream.toByteArray();
ByteArrayInputStream inByteStream = new ByteArrayInputStream(arr);
ObjectInputStream inObjStream = new ObjectInputStream(inByteStream);
List deserialResult = (List)inObjStream.readObject();
for (Iterator iterator = deserialResult.iterator(); iterator.hasNext(); ) {
Employee emp = (Employee)iterator.next();
emp.getPhoneNumbers().size();
}
ReportQuery reportQuery = new ReportQuery();
reportQuery.setShouldReturnWithoutReportQueryResult(true);
reportQuery.setReferenceClass(Employee.class);
ExpressionBuilder builder = reportQuery.getExpressionBuilder();
List joins = new ArrayList(1);
joins.add(builder.anyOfAllowingNone("phoneNumbers"));
reportQuery.addItem("emp", builder, joins);
Vector expectedResult = (Vector)em.getUnitOfWork().executeQuery(reportQuery);
if (!comparer.compareObjects(result, expectedResult)) {
fail("simpleJoinFetchTest Failed when using cache, collections do not match: " + result + " expected: " + expectedResult);
}
//Bypass the cache
clearCache();
em.clear();
result = em.createQuery(ejbqlString).getResultList();
byteStream = new ByteArrayOutputStream();
stream = new ObjectOutputStream(byteStream);
stream.writeObject(result);
stream.flush();
arr = byteStream.toByteArray();
inByteStream = new ByteArrayInputStream(arr);
inObjStream = new ObjectInputStream(inByteStream);
deserialResult = (List)inObjStream.readObject();
for (Iterator iterator = deserialResult.iterator(); iterator.hasNext(); ) {
Employee emp = (Employee)iterator.next();
emp.getPhoneNumbers().size();
}
clearCache();
expectedResult = (Vector)em.getUnitOfWork().executeQuery(reportQuery);
if (!comparer.compareObjects(result, expectedResult)) {
fail("simpleJoinFetchTest Failed when not using cache, collections do not match: " + result + " expected: " + expectedResult);
}
}
//Test case for selecting ALL employees from the database
public void baseTestCase() {
EntityManager em = createEntityManager();
List expectedResult = getServerSession().readAllObjects(Employee.class);
clearCache();
List result = em.createQuery("SELECT OBJECT(emp) FROM Employee emp").getResultList();
Assert.assertTrue("Base Test Case Failed", comparer.compareObjects(result, expectedResult));
}
//Test case for ABS function in EJBQL
public void simpleABSTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
clearCache();
String ejbqlString;
ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "ABS(emp.salary) = ";
ejbqlString = ejbqlString + expectedResult.getSalary();
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("ABS test failed", comparer.compareObjects(result, expectedResult));
}
//Test case for BETWEEN function in EJBQL
public void simpleBetweenTest() {
BigDecimal empId = new BigDecimal(0);
EntityManager em = createEntityManager();
Employee employee = (Employee)(getServerSession().readAllObjects(Employee.class).lastElement());
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.get("id").between(empId, employee.getId());
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id BETWEEN " + empId + " AND " + employee.getId();
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Between test failed", comparer.compareObjects(result, expectedResult));
}
//Test case for concat function in EJBQL
public void simpleConcatTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
clearCache();
String partOne, partTwo;
String ejbqlString;
partOne = expectedResult.getFirstName().substring(0, 2);
partTwo = expectedResult.getFirstName().substring(2);
ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "emp.firstName = ";
ejbqlString = ejbqlString + "CONCAT(\"";
ejbqlString = ejbqlString + partOne;
ejbqlString = ejbqlString + "\", \"";
ejbqlString = ejbqlString + partTwo;
ejbqlString = ejbqlString + "\")";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Concat test failed", comparer.compareObjects(result, expectedResult));
}
//Test case for concat function in EJBQL taking parameters
public void simpleConcatTestWithParameters() {
if ((JUnitTestCase.getServerSession()).getPlatform().isSymfoware()) {
getServerSession().logMessage("Test simpleConcatTestWithParameters skipped for this platform, "
+ "Symfoware doesn't allow dynamic parameters in both arguments to CONCAT at the same time. (bug 304897)");
return;
}
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
clearCache();
String partOne, partTwo;
String ejbqlString;
partOne = expectedResult.getFirstName().substring(0, 2);
partTwo = expectedResult.getFirstName().substring(2);
ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "emp.firstName = ";
ejbqlString = ejbqlString + "CONCAT(";
ejbqlString = ejbqlString + ":partOne";
ejbqlString = ejbqlString + ", ";
ejbqlString = ejbqlString + ":partTwo";
ejbqlString = ejbqlString + ")";
List result = em.createQuery(ejbqlString).setParameter("partOne", partOne).setParameter("partTwo", partTwo).getResultList();
Assert.assertTrue("Concat test failed", comparer.compareObjects(result, expectedResult));
}
//Test case for concat function with constants in EJBQL
public void simpleConcatTestWithConstantsLiteralSecond() {
EntityManager em = createEntityManager();
Employee emp = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
String partOne;
String ejbqlString;
partOne = emp.getFirstName();
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.get("firstName").concat("Smith").like(partOne + "Smith");
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "CONCAT(emp.firstName,\"Smith\") LIKE ";
ejbqlString = ejbqlString + "\"" + partOne + "Smith\"";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Concat test with constraints failed", comparer.compareObjects(result, expectedResult));
}
public void simpleConcatTestWithConstantsLiteralFirst() {
EntityManager em = createEntityManager();
Employee emp = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
String partOne;
String ejbqlString;
partOne = emp.getFirstName();
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.literal("'Smith'").concat(builder.get("firstName")).like("Smith" + partOne);
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "CONCAT(\"Smith\",emp.firstName) LIKE ";
ejbqlString = ejbqlString + "\"Smith"+ partOne + "\"";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Concat test with constraints failed", comparer.compareObjects(result, expectedResult));
}
public void simpleThreeArgConcatTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
clearCache();
String partOne, partTwo, partThree;
String ejbqlString;
partOne = expectedResult.getFirstName().substring(0, 1);
partTwo = expectedResult.getFirstName().substring(1, 2);
partThree = expectedResult.getFirstName().substring(2);
ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "emp.firstName = ";
ejbqlString = ejbqlString + "CONCAT(\"";
ejbqlString = ejbqlString + partOne;
ejbqlString = ejbqlString + "\", \"";
ejbqlString = ejbqlString + partTwo;
ejbqlString = ejbqlString + "\", \"";
ejbqlString = ejbqlString + partThree;
ejbqlString = ejbqlString + "\")";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Concat test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleDistinctTest() {
EntityManager em = createEntityManager();
String ejbqlString = "SELECT DISTINCT e FROM Employee e JOIN FETCH e.phoneNumbers ";
List result = em.createQuery(ejbqlString).getResultList();
Set testSet = new HashSet();
for (Iterator iterator = result.iterator(); iterator.hasNext(); ) {
Employee emp = (Employee)iterator.next();
assertFalse("Result was not distinct", testSet.contains(emp));
testSet.add(emp);
}
}
public void simpleDistinctNullTest() {
EntityManager em = createEntityManager();
Employee emp = (Employee)em.createQuery("SELECT e from Employee e").getResultList().get(0);
String oldFirstName = emp.getFirstName();
beginTransaction(em);
try {
emp = em.find(Employee.class, emp.getId());
emp.setFirstName(null);
commitTransaction(em);
} catch (RuntimeException ex) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw ex;
}
try {
String ejbqlString = "SELECT DISTINCT e.firstName FROM Employee e WHERE e.lastName = '" + emp.getLastName() + "'";
List result = em.createQuery(ejbqlString).getResultList();
assertTrue("Failed to return null value", result.contains(null));
} finally {
try {
beginTransaction(em);
emp = em.find(Employee.class, emp.getId());
emp.setFirstName(oldFirstName);
commitTransaction(em);
} catch (RuntimeException ex) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw ex;
}
}
}
public void simpleDistinctMultipleResultTest() {
EntityManager em = createEntityManager();
String ejbqlString = "SELECT DISTINCT e, e.firstName FROM Employee e JOIN FETCH e.phoneNumbers ";
List result = em.createQuery(ejbqlString).getResultList();
Set testSet = new HashSet();
for (Iterator iterator = result.iterator(); iterator.hasNext(); ) {
String ids = "";
Object[] row = (Object[])iterator.next();
Employee emp = (Employee)row[0];
String string = (String)row[1];
ids = "_" + emp.getId() + "_" + string;
assertFalse("Result was not distinct", testSet.contains(ids));
testSet.add(ids);
}
}
//Test case for double OR function in EJBQL
public void simpleDoubleOrTest() {
Employee emp1, emp2, emp3;
EntityManager em = createEntityManager();
emp1 = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
emp2 = (Employee)(getServerSession().readAllObjects(Employee.class).elementAt(1));
emp3 = (Employee)(getServerSession().readAllObjects(Employee.class).elementAt(2));
clearCache();
Vector expectedResult = new Vector();
expectedResult.add(emp1);
expectedResult.add(emp2);
expectedResult.add(emp3);
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id = " + emp1.getId() + " OR emp.id = " + emp2.getId() + " OR emp.id = " + emp3.getId();
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Double OR test failed", comparer.compareObjects(result, expectedResult));
}
//Test case for equals brackets in EJBQL
public void simpleEqualsBracketsTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "( emp.firstName = ";
ejbqlString = ejbqlString + "\"" + expectedResult.getFirstName() + "\")";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Equals brackets test failed", comparer.compareObjects(result, expectedResult));
}
//Test case for equals in EJBQL
public void simpleEqualsTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "emp.firstName = ";
ejbqlString = ejbqlString + "\"" + expectedResult.getFirstName() + "\"";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Equals test failed", comparer.compareObjects(expectedResult, result));
}
//Test case for equals with join in EJBQL
public void simpleEqualsTestWithJoin() {
EntityManager em = createEntityManager();
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.anyOf("managedEmployees").get("address").get("city").equal("Ottawa");
Vector expectedResult = getServerSession().readAllObjects(Employee.class, whereClause);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp, IN(emp.managedEmployees) managedEmployees " + "WHERE managedEmployees.address.city = 'Ottawa'";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Equals test with Join failed", comparer.compareObjects(result, expectedResult));
}
public void simpleEqualsWithAs() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)(getServerSession().readAllObjects(Employee.class).firstElement());
clearCache();
Vector employeesUsed = new Vector();
employeesUsed.add(expectedResult);
String ejbqlString = "SELECT OBJECT(emp) FROM Employee AS emp WHERE emp.id = " + expectedResult.getId();
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Equals test with As failed", comparer.compareObjects(expectedResult, result));
}
public void collectionMemberIdentifierEqualsTest() {
EntityManager em = createEntityManager();
ExpressionBuilder employees = new ExpressionBuilder();
Expression exp = employees.get("firstName").equal("Bob");
exp = exp.and(employees.get("lastName").equal("Smith"));
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class, exp).firstElement();
clearCache();
PhoneNumber phoneNumber = (PhoneNumber)((Vector)expectedResult.getPhoneNumbers()).firstElement();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp, IN (emp.phoneNumbers) phone " + "WHERE phone = ?1";
List result = em.createQuery(ejbqlString).setParameter(1, phoneNumber).getResultList();
Assert.assertTrue("CollectionMemberIdentifierEqualsTest failed", comparer.compareObjects(expectedResult, result));
}
public void abstractSchemaIdentifierEqualsTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).firstElement();
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp = ?1";
List result = em.createQuery(ejbqlString).setParameter(1, expectedResult).getResultList();
Assert.assertTrue("abstractSchemaIdentifierEqualsTest failed", comparer.compareObjects(expectedResult, result));
}
public void abstractSchemaIdentifierNotEqualsTest() {
EntityManager em = createEntityManager();
Vector expectedResult = getServerSession().readAllObjects(Employee.class);
clearCache();
Employee emp = (Employee)expectedResult.firstElement();
expectedResult.removeElementAt(0);
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp <> ?1";
List result = em.createQuery(ejbqlString).setParameter(1, emp).getResultList();
Assert.assertTrue("abstractSchemaIdentifierNotEqualsTest failed", comparer.compareObjects(result, expectedResult));
}
public void simpleInOneDotTest() {
//select a specifif employee using Expr Bob Smithn
EntityManager em = createEntityManager();
ReadObjectQuery roq = new ReadObjectQuery(Employee.class);
ExpressionBuilder empBldr = new ExpressionBuilder();
Expression exp1 = empBldr.get("firstName").equal("Bob");
Expression exp2 = empBldr.get("lastName").equal("Smith");
roq.setSelectionCriteria(exp1.and(exp2));
Employee expectedResult = (Employee)getServerSession().executeQuery(roq);
clearCache();
PhoneNumber empPhoneNumbers = (PhoneNumber)((Vector)expectedResult.getPhoneNumbers()).firstElement();
String ejbqlString = "SelecT OBJECT(emp) from Employee emp, in (emp.phoneNumbers) phone " + "Where phone.areaCode = \"" + empPhoneNumbers.getAreaCode() + "\"" + "AND emp.firstName = \"" + expectedResult.getFirstName() + "\"";
ejbqlString = ejbqlString + "AND emp.lastName = \"" + expectedResult.getLastName() + "\"";
Employee result = (Employee)em.createQuery(ejbqlString).getSingleResult();
Assert.assertTrue("Simple In Dot Test failed", comparer.compareObjects(result, expectedResult));
}
public void selectAverageQueryForByteColumnTest() {
EntityManager em = createEntityManager();
String ejbqlString = "Select AVG(emp.salary)from Employee emp";
Object result = em.createQuery(ejbqlString).getSingleResult();
Assert.assertTrue("AVG result type [" + result.getClass() + "] not of type Double", result.getClass() == Double.class);
}
public void simpleInTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id IN (" + expectedResult.getId().toString() + ")";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple In Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleInListTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
List expectedResultList = new ArrayList();
expectedResultList.add(expectedResult.getId());
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id IN :result";
List result = em.createQuery(ejbqlString).setParameter("result", expectedResultList).getResultList();
Assert.assertTrue("Simple In Test failed", comparer.compareObjects(result, expectedResult));
}
/**
* Test for Bug 259974 - JPQL IN function doesn't work with negative literal values
* This test executes a JPQL statement with an IN function with a negative literal value
* and ensures it successfully returns the correct value.
*/
public void simpleInNegativeTest() {
EntityManager em = createEntityManager();
beginTransaction(em);
try{
Employee expectedResult = new Employee();
expectedResult.setSalary(-12345);
em.persist(expectedResult);
em.flush();
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.salary IN(-12345)";
Employee result = (Employee)em.createQuery(ejbqlString).getSingleResult();
Assert.assertTrue("Simple In Negative Test failed", comparer.compareObjects(result, expectedResult));
} finally{
rollbackTransaction(em);
closeEntityManager(em);
}
}
public void simpleLengthTest() {
if ((JUnitTestCase.getServerSession()).getPlatform().isSQLServer()) {
getServerSession().logMessage("Warning SQL doesnot support LENGTH function");
return;
}
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String ejbqlString;
ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "LENGTH ( emp.firstName ) = ";
ejbqlString = ejbqlString + expectedResult.getFirstName().length();
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Length Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleLikeTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String partialFirstName = expectedResult.getFirstName().substring(0, 3) + "%";
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName LIKE \"" + partialFirstName + "\"";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Like Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleLikeTestWithParameter() {
EntityManager em = createEntityManager();
Employee emp = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
String partialFirstName = "%" + emp.getFirstName().substring(0, 3) + "%";
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
Vector parameters = new Vector();
parameters.add(partialFirstName);
ExpressionBuilder eb = new ExpressionBuilder();
Expression whereClause = eb.get("firstName").like(partialFirstName);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName LIKE ?1";
List result = em.createQuery(ejbqlString).setParameter(1, partialFirstName).getResultList();
Assert.assertTrue("Simple Like Test with Parameter failed", comparer.compareObjects(result, expectedResult));
}
public void simpleLikeEscapeTestWithParameter() {
EntityManager em = createEntityManager();
Address expectedResult = new Address();
expectedResult.setCity("TAIYUAN");
expectedResult.setCountry("CHINA");
expectedResult.setProvince("SHANXI");
expectedResult.setPostalCode("030024");
expectedResult.setStreet("234 RUBY _Way");
Server serverSession = JUnitTestCase.getServerSession();
Session clientSession = serverSession.acquireClientSession();
UnitOfWork uow = clientSession.acquireUnitOfWork();
uow.registerObject(expectedResult);
uow.commit();
//test the apostrophe
String ejbqlString = "SELECT OBJECT(address) FROM Address address WHERE address.street LIKE :pattern ESCAPE :esc";
String patternString = null;
Character escChar = null;
// \ is always treated as escape in MySQL. Therefore ESCAPE '\' is considered a syntax error
if (getServerSession().getPlatform().isMySQL()) {
patternString = "234 RUBY $_Way";
escChar = '$';
} else {
patternString = "234 RUBY \\_Way";
escChar = '\\';
}
List result = em.createQuery(ejbqlString).setParameter("pattern", patternString).setParameter("esc", escChar).getResultList();
Assert.assertTrue("Simple Escape Underscore test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleNotBetweenTest() {
EntityManager em = createEntityManager();
Employee emp1 = (Employee)getServerSession().readAllObjects(Employee.class).firstElement();
Employee emp2 = (Employee)getServerSession().readAllObjects(Employee.class).lastElement();
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
ExpressionBuilder eb = new ExpressionBuilder();
Expression whereClause = eb.get("id").between(emp1.getId(), emp2.getId()).not();
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "emp.id NOT BETWEEN ";
ejbqlString = ejbqlString + emp1.getId().toString();
ejbqlString = ejbqlString + " AND ";
ejbqlString = ejbqlString + emp2.getId().toString();
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Not Between Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleNotEqualsVariablesInteger() {
EntityManager em = createEntityManager();
Vector expectedResult = getServerSession().readAllObjects(Employee.class);
clearCache();
Employee emp = (Employee)expectedResult.elementAt(0);
expectedResult.removeElementAt(0);
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id <> " + emp.getId();
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Like Test with Parameter failed", comparer.compareObjects(result, expectedResult));
}
public void simpleNotInTest() {
EntityManager em = createEntityManager();
Employee emp = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
ExpressionBuilder builder = new ExpressionBuilder();
Vector idVector = new Vector();
idVector.add(emp.getId());
Expression whereClause = builder.get("id").notIn(idVector);
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id NOT IN (" + emp.getId().toString() + ")";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Not In Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleNotLikeTest() {
EntityManager em = createEntityManager();
Employee emp = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
String partialFirstName = emp.getFirstName().substring(0, 3) + "%";
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.get("firstName").notLike(partialFirstName);
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName NOT LIKE \"" + partialFirstName + "\"";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Not Like Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleOrFollowedByAndTest() {
EntityManager em = createEntityManager();
Employee emp1 = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
Employee emp2 = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(1);
Employee emp3 = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(2);
Vector expectedResult = new Vector();
expectedResult.add(emp1);
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id = " + emp1.getId() + " OR emp.id = " + emp2.getId() + " AND emp.id = " + emp3.getId();
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Or followed by And Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleOrFollowedByAndTestWithStaticNames() {
EntityManager em = createEntityManager();
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.get("firstName").equal("John").or(builder.get("firstName").equal("Bob").and(builder.get("lastName").equal("Smith")));
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName = \"John\" OR emp.firstName = \"Bob\" AND emp.lastName = \"Smith\"";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Or followed by And With Static Names Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleOrTest() {
EntityManager em = createEntityManager();
Employee emp1 = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
Employee emp2 = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(1);
Vector expectedResult = new Vector();
expectedResult.add(emp1);
expectedResult.add(emp2);
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.id = " + emp1.getId() + " OR emp.id = " + emp2.getId();
List result = em.createQuery(ejbqlString).getResultList();
clearCache();
Assert.assertTrue("Simple Or Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleParameterTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
String parameterName = "firstName";
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.get("firstName").equal(builder.getParameter(parameterName));
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
raq.addArgument(parameterName);
Vector parameters = new Vector();
parameters.add(expectedResult.getFirstName());
List employees = (List)getServerSession().executeQuery(raq, parameters);
employees.size();
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE " + "emp.firstName = ?1 ";
List result = em.createQuery(ejbqlString).setParameter(1, parameters.get(0)).getResultList();
Assert.assertTrue("Simple Parameter Test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleParameterTestChangingParameters() {
EntityManager em = createEntityManager();
Employee emp1 = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
Employee emp2 = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(1);
String parameterName = "firstName";
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.get("firstName").equal(builder.getParameter(parameterName));
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
raq.addArgument(parameterName);
Vector firstParameters = new Vector();
firstParameters.add(emp1.getFirstName());
Vector secondParameters = new Vector();
secondParameters.add(emp2.getFirstName());
Vector firstEmployees = (Vector)getServerSession().executeQuery(raq, firstParameters);
clearCache();
Vector secondEmployees = (Vector)getServerSession().executeQuery(raq, secondParameters);
clearCache();
Vector expectedResult = new Vector();
expectedResult.addAll(firstEmployees);
expectedResult.addAll(secondEmployees);
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE " + "emp.firstName = ?1 ";
List firstResultSet = em.createQuery(ejbqlString).setParameter(1, firstParameters.get(0)).getResultList();
clearCache();
List secondResultSet = em.createQuery(ejbqlString).setParameter(1, secondParameters.get(0)).getResultList();
clearCache();
Vector result = new Vector();
result.addAll(firstResultSet);
result.addAll(secondResultSet);
Assert.assertTrue("Simple Parameter Test Changing Parameters failed", comparer.compareObjects(result, expectedResult));
}
public void simpleReverseAbsTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE " + expectedResult.getSalary() + " = ABS(emp.salary)";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Reverse Abs test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleReverseConcatTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String partOne = expectedResult.getFirstName().substring(0, 2);
String partTwo = expectedResult.getFirstName().substring(2);
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "CONCAT(\"";
ejbqlString = ejbqlString + partOne;
ejbqlString = ejbqlString + "\", \"";
ejbqlString = ejbqlString + partTwo;
ejbqlString = ejbqlString + "\")";
ejbqlString = ejbqlString + " = emp.firstName";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Reverse Concat test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleReverseEqualsTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "\"" + expectedResult.getFirstName() + "\"";
ejbqlString = ejbqlString + " = emp.firstName";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Reverse Equals test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleReverseLengthTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + expectedResult.getFirstName().length();
ejbqlString = ejbqlString + " = LENGTH(emp.firstName)";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Reverse Length test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleReverseParameterTest() {
EntityManager em = createEntityManager();
Employee emp = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String parameterName = "firstName";
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.get("firstName").equal(builder.getParameter(parameterName));
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
raq.addArgument(parameterName);
Vector parameters = new Vector();
parameters.add(emp.getFirstName());
Vector expectedResult = (Vector)getServerSession().executeQuery(raq, parameters);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "?1 = emp.firstName ";
List result = em.createQuery(ejbqlString).setParameter(1, parameters.get(0)).getResultList();
Assert.assertTrue("Simple Reverse Parameter test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleReverseSqrtTest() {
if ((JUnitTestCase.getServerSession()).getPlatform().isSymfoware()) {
getServerSession().logMessage("Test simpleReverseSqrtTest skipped for this platform, "
+ "Symfoware doesn't support SQRT, COS, SIN, TAN functions.");
return;
}
EntityManager em = createEntityManager();
ExpressionBuilder expbldr = new ExpressionBuilder();
Expression whereClause = expbldr.get("firstName").equal("SquareRoot").and(expbldr.get("lastName").equal("TestCase1"));
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
double salarySquareRoot = Math.sqrt(((double) ((Employee) expectedResult.firstElement()).getSalary()));
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + salarySquareRoot;
ejbqlString = ejbqlString + " = SQRT(emp.salary)";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Reverse Square Root test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleReverseSubstringTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String firstNamePart;
String ejbqlString;
firstNamePart = expectedResult.getFirstName().substring(0, 2);
ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "\"" + firstNamePart + "\"";
ejbqlString = ejbqlString + " = SUBSTRING(emp.firstName, 1, 2)";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Reverse SubString test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleSqrtTest() {
if ((JUnitTestCase.getServerSession()).getPlatform().isSymfoware()) {
getServerSession().logMessage("Test simpleSqrtTest skipped for this platform, "
+ "Symfoware doesn't support SQRT, COS, SIN, TAN functions.");
return;
}
EntityManager em = createEntityManager();
ExpressionBuilder expbldr = new ExpressionBuilder();
Expression whereClause = expbldr.get("firstName").equal("SquareRoot").and(expbldr.get("lastName").equal("TestCase1"));
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
double salarySquareRoot = Math.sqrt(((double) ((Employee) expectedResult.firstElement()).getSalary()));
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "SQRT(emp.salary) = ";
ejbqlString = ejbqlString + salarySquareRoot;
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Square Root test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleSubstringTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readAllObjects(Employee.class).elementAt(0);
clearCache();
String firstNamePart = expectedResult.getFirstName().substring(0, 2);
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "SUBSTRING(emp.firstName, 1, 2) = \""; //changed from 0, 2 to 1, 2(ZYP)
ejbqlString = ejbqlString + firstNamePart + "\"";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple SubString test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleNullTest() {
EntityManager em = createEntityManager();
Employee nullEmployee = new Employee();
nullEmployee.setFirstName(null);
nullEmployee.setLastName("Test");
Server serverSession = JUnitTestCase.getServerSession();
Session clientSession = serverSession.acquireClientSession();
UnitOfWork uow = clientSession.acquireUnitOfWork();
uow.registerObject(nullEmployee);
uow.commit();
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.get("firstName").isNull();
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName IS NULL";
List result = em.createQuery(ejbqlString).getResultList();
uow = clientSession.acquireUnitOfWork();
uow.deleteObject(nullEmployee);
uow.commit();
Assert.assertTrue("Simple Null test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleNotNullTest() {
EntityManager em = createEntityManager();
Employee nullEmployee = new Employee();
nullEmployee.setFirstName(null);
nullEmployee.setLastName("Test");
Server serverSession = JUnitTestCase.getServerSession();
Session clientSession = serverSession.acquireClientSession();
UnitOfWork uow = clientSession.acquireUnitOfWork();
uow.registerObject(nullEmployee);
uow.commit();
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.get("firstName").isNull().not();
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName IS NOT NULL";
List result = em.createQuery(ejbqlString).getResultList();
uow = clientSession.acquireUnitOfWork();
uow.deleteObject(nullEmployee);
uow.commit();
Assert.assertTrue("Simple Not Null test failed", comparer.compareObjects(result, expectedResult));
}
public void distinctTest() {
EntityManager em = createEntityManager();
ReadAllQuery raq = new ReadAllQuery();
ExpressionBuilder employee = new ExpressionBuilder();
Expression whereClause = employee.get("lastName").equal("Smith");
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
raq.useDistinct();
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT DISTINCT OBJECT(emp) FROM Employee emp WHERE emp.lastName = \'Smith\'";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Distinct test failed", comparer.compareObjects(result, expectedResult));
}
public void multipleExecutionOfNamedQueryTest() {
//bug 5279859
EntityManager em = createEntityManager();
Query query = em.createNamedQuery("findEmployeeByPostalCode");
query.setParameter("postalCode", "K1T3B9");
try {
query.getResultList();
} catch (RuntimeException ex) {
fail("Failed to execute query, exception resulted on first execution, not expected");
}
try {
query.getResultList();
} catch (RuntimeException ex) {
fail("Failed to execute query, exception resulted on second execution");
}
query = em.createNamedQuery("findEmployeeByPostalCode");
query.setParameter("postalCode", "K1T3B9");
try {
query.getResultList();
} catch (RuntimeException ex) {
fail("Failed to execute query, exception resulted on first execution, of second use of named query");
}
query.setMaxResults(100000);
try {
query.getResultList();
} catch (RuntimeException ex) {
fail("Failed to execute query, exception resulted after setting max results (forcing reprepare)");
}
}
public void conformResultsInUnitOfWorkTest() {
ReadObjectQuery readObjectQuery = new ReadObjectQuery();
readObjectQuery.setReferenceClass(Employee.class);
readObjectQuery.setEJBQLString("SELECT OBJECT(emp) FROM Employee emp WHERE emp.id = ?1");
readObjectQuery.conformResultsInUnitOfWork();
readObjectQuery.addArgument("1", Integer.class);
//ServerSession next
Server serverSession = getServerSession().getProject().createServerSession();
serverSession.setSessionLog(getServerSession().getSessionLog());
serverSession.login();
UnitOfWork unitOfWork = serverSession.acquireUnitOfWork();
Employee newEmployee = new Employee();
newEmployee.setId(9000);
unitOfWork.registerObject(newEmployee);
Vector testV = new Vector();
testV.addElement(9000);
Employee result = (Employee)unitOfWork.executeQuery(readObjectQuery, testV);
Assert.assertTrue("Conform Results In Unit of Work using ServerSession failed", comparer.compareObjects(result, newEmployee));
serverSession.logout();
}
public void simpleModTest() {
EntityManager em = createEntityManager();
//Assert.assertFalse("Warning SQL/Sybase doesnot support MOD function", (JUnitTestCase.getServerSession()).getPlatform().isSQLServer() || (JUnitTestCase.getServerSession()).getPlatform().isSybase());
ReadAllQuery raq = new ReadAllQuery();
ExpressionBuilder employee = new ExpressionBuilder();
Expression whereClause = ExpressionMath.mod(employee.get("salary"), 2).greaterThan(0);
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE MOD(emp.salary, 2) > 0";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Mod test failed", comparer.compareObjects(result, expectedResult));
// Test MOD(fieldAccess, fieldAccess) glassfish issue 2771
expectedResult = getServerSession().readAllObjects(Employee.class);
clearCache();
ejbqlString = "SELECT emp FROM Employee emp WHERE MOD(emp.salary, emp.salary) = 0";
result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Mod test(2) failed", comparer.compareObjects(result, expectedResult));
}
public void simpleIsEmptyTest() {
EntityManager em = createEntityManager();
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.isEmpty("phoneNumbers");
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.phoneNumbers IS EMPTY";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Is empty test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleIsNotEmptyTest() {
EntityManager em = createEntityManager();
ExpressionBuilder builder = new ExpressionBuilder();
Expression whereClause = builder.notEmpty("phoneNumbers");
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.phoneNumbers IS NOT EMPTY";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple is not empty test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleApostrohpeTest() {
EntityManager em = createEntityManager();
Vector addresses = getServerSession().readAllObjects(Address.class);
clearCache();
Address expectedResult = new Address();
Iterator addressesIterator = addresses.iterator();
while (addressesIterator.hasNext()) {
expectedResult = (Address)addressesIterator.next();
if (expectedResult.getStreet().indexOf("Lost") != -1) {
break;
}
}
String ejbqlString = "SELECT OBJECT(address) FROM Address address WHERE ";
ejbqlString = ejbqlString + "address.street = '234 I''m Lost Lane'";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple apostrophe test failed", comparer.compareObjects(result, expectedResult));
}
public void simpleEscapeUnderscoreTest() {
EntityManager em = createEntityManager();
Address expectedResult = new Address();
expectedResult.setCity("Perth");
expectedResult.setCountry("Canada");
expectedResult.setProvince("ONT");
expectedResult.setPostalCode("Y3Q2N9");
expectedResult.setStreet("234 Wandering _Way");
Server serverSession = JUnitTestCase.getServerSession();
Session clientSession = serverSession.acquireClientSession();
UnitOfWork uow = clientSession.acquireUnitOfWork();
uow.registerObject(expectedResult);
uow.commit();
//test the apostrophe
String ejbqlString = "SELECT OBJECT(address) FROM Address address WHERE ";
// \ is always treated as escape in MySQL. Therefore ESCAPE '\' is considered a syntax error
if (getServerSession().getPlatform().isMySQL() || getServerSession().getPlatform().isPostgreSQL()) {
ejbqlString = ejbqlString + "address.street LIKE '234 Wandering $_Way' ESCAPE '$'";
} else {
ejbqlString = ejbqlString + "address.street LIKE '234 Wandering \\_Way' ESCAPE '\\'";
}
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Escape Underscore test failed", comparer.compareObjects(result, expectedResult));
}
public void smallProjectMemberOfProjectsTest() {
EntityManager em = createEntityManager();
ReadAllQuery query = new ReadAllQuery();
Expression selectionCriteria = new ExpressionBuilder().anyOf("projects").equal(new ExpressionBuilder(SmallProject.class));
query.setSelectionCriteria(selectionCriteria);
query.setReferenceClass(Employee.class);
query.dontUseDistinct(); //gf 1395 changed jpql to not use distinct on joins
Vector expectedResult = (Vector)getServerSession().executeQuery(query);
clearCache();
//setup the EJBQL to do the same
String ejbqlString = "SELECT OBJECT(employee) FROM Employee employee, SmallProject sp WHERE ";
ejbqlString = ejbqlString + "sp MEMBER OF employee.projects";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple small Project Member Of Projects test failed", comparer.compareObjects(result, expectedResult));
}
public void smallProjectNOTMemberOfProjectsTest() {
EntityManager em = createEntityManager();
//query for those employees with Project named "Enterprise" (which should be
//a SmallProject)
ReadObjectQuery smallProjectQuery = new ReadObjectQuery();
smallProjectQuery.setReferenceClass(SmallProject.class);
smallProjectQuery.setSelectionCriteria(new ExpressionBuilder().get("name").equal("Enterprise"));
SmallProject smallProject = (SmallProject)getServerSession().executeQuery(smallProjectQuery);
ReadAllQuery query = new ReadAllQuery();
query.addArgument("smallProject");
Expression selectionCriteria = new ExpressionBuilder().noneOf("projects", new ExpressionBuilder().equal(new ExpressionBuilder().getParameter("smallProject")));
query.setSelectionCriteria(selectionCriteria);
query.setReferenceClass(Employee.class);
Vector arguments = new Vector();
arguments.add(smallProject);
Vector expectedResult = (Vector)getServerSession().executeQuery(query, arguments);
//setup the EJBQL to do the same
String ejbqlString = "SELECT OBJECT(employee) FROM Employee employee WHERE ";
ejbqlString = ejbqlString + "?1 NOT MEMBER OF employee.projects";
List result = em.createQuery(ejbqlString).setParameter(1, smallProject).getResultList();
Assert.assertTrue("Simple small Project NOT Member Of Projects test failed", comparer.compareObjects(result, expectedResult));
}
//This test demonstrates the bug 4616218, waiting for bug fix
public void selectCountOneToOneTest() {
EntityManager em = createEntityManager();
ReportQuery query = new ReportQuery();
query.setReferenceClass(PhoneNumber.class);
//need to specify Long return type
query.addCount("COUNT", new ExpressionBuilder().get("owner").distinct(), Long.class);
query.returnSingleAttribute();
query.dontRetrievePrimaryKeys();
query.setName("selectEmployeesThatHavePhoneNumbers");
Vector expectedResult = (Vector)getServerSession().executeQuery(query);
clearCache();
//setup the EJBQL to do the same
String ejbqlString = "SELECT COUNT(DISTINCT phone.owner) FROM PhoneNumber phone";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Select Count One To One test failed", expectedResult.elementAt(0).equals(result.get(0)));
}
public void selectOneToOneTest() {
EntityManager em = createEntityManager();
ReadAllQuery query = new ReadAllQuery();
query.setReferenceClass(Address.class);
query.useDistinct();
ExpressionBuilder employeeBuilder = new ExpressionBuilder(Employee.class);
Expression selectionCriteria = new ExpressionBuilder(Address.class).equal(employeeBuilder.get("address")).and(employeeBuilder.get("lastName").like("%Way%"));
query.setSelectionCriteria(selectionCriteria);
if (usesSOP() && getServerSession().getPlatform().isOracle()) {
// distinct is incompatible with blob in selection clause on Oracle
query.setShouldUseSerializedObjectPolicy(false);
}
Vector expectedResult = (Vector)getServerSession().executeQuery(query);
clearCache();
//setup the EJBQL to do the same
String ejbqlString = "SELECT DISTINCT employee.address FROM Employee employee WHERE employee.lastName LIKE '%Way%'";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple Select One To One test failed", comparer.compareObjects(result, expectedResult));
}
public void selectPhonenumberDeclaredInINClauseTest() {
EntityManager em = createEntityManager();
ReadAllQuery query = new ReadAllQuery();
ExpressionBuilder employeeBuilder = new ExpressionBuilder(Employee.class);
Expression phoneAnyOf = employeeBuilder.anyOf("phoneNumbers");
ExpressionBuilder phoneBuilder = new ExpressionBuilder(PhoneNumber.class);
Expression selectionCriteria = phoneBuilder.equal(employeeBuilder.anyOf("phoneNumbers")).and(phoneAnyOf.get("number").notNull());
query.setSelectionCriteria(selectionCriteria);
query.setReferenceClass(PhoneNumber.class);
query.addAscendingOrdering("number");
query.addAscendingOrdering("areaCode");
Vector expectedResult = (Vector)getServerSession().executeQuery(query);
clearCache();
// Setup the EJBQL to do the same.
String ejbqlString = "Select Distinct Object(p) from Employee emp, IN(emp.phoneNumbers) p WHERE ";
ejbqlString = ejbqlString + "p.number IS NOT NULL ORDER BY p.number, p.areaCode";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple select Phonenumber Declared In IN Clause test failed", comparer.compareObjects(result, expectedResult));
}
/**
* Test the ALL function.
* This test was added to mirror a CTS failure.
* This currently throws an error but should be a valid (although odd) query.
* BUG#6025292
public void badSelectPhoneUsingALLTest()
{
org.eclipse.persistence.jpa.EntityManager em = (org.eclipse.persistence.jpa.EntityManager) createEntityManager();
ReadAllQuery query = new ReadAllQuery();
ExpressionBuilder employeeBuilder = new ExpressionBuilder(Employee.class);
Expression phoneAnyOf = employeeBuilder.anyOf("phoneNumbers");
ExpressionBuilder phoneBuilder = new ExpressionBuilder(PhoneNumber.class);
ReportQuery subQuery = new ReportQuery();
subQuery.setReferenceClass(PhoneNumber.class);
subQuery.addMinimum("number");
//bad sql - Expression selectionCriteria = employeeBuilder.anyOf("phoneNumbers").equal(employeeBuilder.all(subQuery));
//bad sql - Expression selectionCriteria = employeeBuilder.anyOf("phoneNumbers").equal(subQuery);
Expression selectionCriteria = phoneBuilder.equal(employeeBuilder.anyOf("phoneNumbers")).and(
phoneAnyOf.get("number").equal(employeeBuilder.all(subQuery)));
query.setSelectionCriteria(selectionCriteria);
query.setReferenceClass(Employee.class);
Vector expectedResult = (Vector)getServerSession().executeQuery(query);
clearCache();
// Setup the EJBQL to do the same.
String ejbqlString = "Select Distinct Object(emp) from Employee emp, IN(emp.phoneNumbers) p WHERE ";
ejbqlString = ejbqlString + "p.number = ALL (Select MIN(pp.number) FROM PhoneNumber pp)";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("Simple select Phonenumber Declared In IN Clause test failed", comparer.compareObjects(result, expectedResult));
}*/
/**
* Test the ALL function.
* This test was added to mirror a CTS failure.
*/
public void selectPhoneUsingALLTest() {
EntityManager em = createEntityManager();
ReadAllQuery query = new ReadAllQuery();
ExpressionBuilder employeeBuilder = new ExpressionBuilder(Employee.class);
ReportQuery subQuery = new ReportQuery();
subQuery.setReferenceClass(PhoneNumber.class);
subQuery.addMinimum("number");
Expression selectionCriteria = employeeBuilder.anyOf("phoneNumbers").get("number").equal(employeeBuilder.all(subQuery));
query.setSelectionCriteria(selectionCriteria);
query.setReferenceClass(Employee.class);
if (usesSOP() && getServerSession().getPlatform().isOracle()) {
// distinct is incompatible with blob in selection clause on Oracle
query.dontUseDistinct();
}
Vector expectedResult = (Vector)getServerSession().executeQuery(query);
clearCache();
// Setup the EJBQL to do the same.
String ejbqlString = "Select Distinct Object(emp) from Employee emp, IN(emp.phoneNumbers) p WHERE ";
ejbqlString = ejbqlString + "p.number = ALL (Select MIN(pp.number) FROM PhoneNumber pp)";
Query jpqlQuery = em.createQuery(ejbqlString);
jpqlQuery.setMaxResults(10);
if (usesSOP() && getServerSession().getPlatform().isOracle()) {
// distinct is incompatible with blob in selection clause on Oracle
jpqlQuery.setHint(QueryHints.SERIALIZED_OBJECT, "false");
}
List result = jpqlQuery.getResultList();
Assert.assertTrue("Simple select Phonenumber Declared In IN Clause test failed", comparer.compareObjects(result, expectedResult));
}
public void selectSimpleMemberOfWithParameterTest() {
EntityManager em = createEntityManager();
Employee expectedResult = (Employee)getServerSession().readObject(Employee.class);
PhoneNumber phone = new PhoneNumber();
phone.setAreaCode("613");
phone.setNumber("1234567");
phone.setType("cell");
Server serverSession = JUnitTestCase.getServerSession();
Session clientSession = serverSession.acquireClientSession();
UnitOfWork uow = clientSession.acquireUnitOfWork();
PhoneNumber phoneClone = (PhoneNumber)uow.registerObject(phone);
Employee empClone = (Employee)uow.registerObject(expectedResult);
phoneClone.setOwner(empClone);
empClone.addPhoneNumber(phoneClone);
uow.registerObject(phone);
uow.commit();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp " + "WHERE ?1 MEMBER OF emp.phoneNumbers";
Vector parameters = new Vector();
parameters.add(phone);
List result = em.createQuery(ejbqlString).setParameter(1, phone).getResultList();
uow = clientSession.acquireUnitOfWork();
uow.deleteObject(phone);
uow.commit();
Assert.assertTrue("Select simple member of with parameter test failed", comparer.compareObjects(result, expectedResult));
}
public void selectSimpleNotMemberOfWithParameterTest() {
EntityManager em = createEntityManager();
Vector<Employee> expectedResult = getServerSession().readAllObjects(Employee.class);
clearCache();
Employee emp = expectedResult.get(0);
expectedResult.remove(0);
boolean shouldCleanUp = false;
PhoneNumber phone;
if (emp.getPhoneNumbers().isEmpty()) {
phone = new PhoneNumber();
phone.setAreaCode("613");
phone.setNumber("1234567");
phone.setType("cell");
Server serverSession = JUnitTestCase.getServerSession();
Session clientSession = serverSession.acquireClientSession();
UnitOfWork uow = clientSession.acquireUnitOfWork();
emp = (Employee)uow.readObject(emp);
PhoneNumber phoneClone = (PhoneNumber)uow.registerObject(phone);
emp.addPhoneNumber(phoneClone);
if (usesSOP()) {
// In SOP is used then the phone is never read back (it's saved in sopObject),
// therefore its ownerId (mapped as read only) is never set.
// If phone.ownerId is not set, then the next query (that takes phone as a parameter) would return all the employees,
// it supposed to return all the employees minus emp.
phoneClone.setId(emp.getId());
}
uow.commit();
phone = emp.getPhoneNumbers().iterator().next();
shouldCleanUp = true;
} else {
phone = emp.getPhoneNumbers().iterator().next();
}
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp " + "WHERE ?1 NOT MEMBER OF emp.phoneNumbers";
Vector parameters = new Vector();
parameters.add(phone);
List result = em.createQuery(ejbqlString).setParameter(1, phone).getResultList();
boolean ok = comparer.compareObjects(result, expectedResult);
if (shouldCleanUp) {
Server serverSession = JUnitTestCase.getServerSession();
Session clientSession = serverSession.acquireClientSession();
UnitOfWork uow = clientSession.acquireUnitOfWork();
emp = (Employee)uow.readObject(emp);
PhoneNumber phoneToRemove = emp.getPhoneNumbers().iterator().next();
emp.removePhoneNumber(phoneToRemove);
uow.deleteObject(phoneToRemove);
uow.commit();
}
if (!ok) {
fail("unexpected query result");
}
}
public void selectSimpleNotMemberOfWithParameterNestedTest() {
EntityManager em = createEntityManager();
String all = "SELECT p FROM Project p WHERE p.teamLeader IS NOT NULL";
List<Project> allProjectsWithTeamLeader = em.createQuery(all).getResultList();
Assert.assertTrue("No projects with team leaders.", !allProjectsWithTeamLeader.isEmpty());
PhoneNumber phone = null;
for (Project project : allProjectsWithTeamLeader) {
if (project.getTeamLeader().getPhoneNumbers().size() > 0) {
phone = project.getTeamLeader().getPhoneNumbers().iterator().next();
break;
}
}
Assert.assertTrue("Not a single teamLeader has a phone!", phone != null);
String ejbqlString1 = "SELECT p FROM Project p WHERE p.teamLeader IS NOT NULL AND ?1 MEMBER OF p.teamLeader.phoneNumbers";
List result1 = em.createQuery(ejbqlString1).setParameter("1", phone).getResultList();
Assert.assertTrue("MEMBER OF result is empty", !result1.isEmpty());
String ejbqlString2 = "SELECT p FROM Project p WHERE p.teamLeader IS NOT NULL AND ?1 NOT MEMBER OF p.teamLeader.phoneNumbers";
List result2 = em.createQuery(ejbqlString2).setParameter("1", phone).getResultList();
Assert.assertTrue("NOT MEMBER OF result is empty", !result2.isEmpty());
List union = new ArrayList(result1);
union.addAll(result2);
Assert.assertTrue("Union of results of MEMBER OF and NON MEMBER OF not equal to all projects with team leaders", comparer.compareObjects(union, allProjectsWithTeamLeader));
for (int i=0; i < result2.size(); i++) {
if (result1.contains(result2.get(i))) {
fail("results of MEMBER OF and NON MEMBER OF intersect");
}
}
}
public void selectDirectCollectionNotMemberTest() {
EntityManager em = createEntityManager();
Collection allEmps = getServerSession().readAllObjects(Employee.class);
String ejbqlString1 = "SELECT e FROM Employee e WHERE 'Clean the kitchen.' MEMBER OF e.responsibilities";
List result1 = em.createQuery(ejbqlString1).getResultList();
Assert.assertTrue("MEMBER OF result is empty", !result1.isEmpty());
String ejbqlString2 = "SELECT e FROM Employee e WHERE 'Clean the kitchen.' NOT MEMBER OF e.responsibilities";
List result2 = em.createQuery(ejbqlString2).getResultList();
Assert.assertTrue("NOT MEMBER OF result is empty", !result2.isEmpty());
List union = new ArrayList(result1);
union.addAll(result2);
Assert.assertTrue("Union of results of MEMBER OF and NOT MEMBER OF not equal to all employees", comparer.compareObjects(union, allEmps));
for (int i=0; i < result2.size(); i++) {
if (result1.contains(result2.get(i))) {
fail("results of MEMBER OF and NOT MEMBER OF intersect");
}
}
}
public void selectDirectCollectionNonMemberNestedTest() {
EntityManager em = createEntityManager();
String all = "SELECT p FROM Project p WHERE p.teamLeader IS NOT NULL";
List<Project> allProjectsWithTeamLeader = em.createQuery(all).getResultList();
Assert.assertTrue("No projects with team leaders.", !allProjectsWithTeamLeader.isEmpty());
String responsibility = null;
for (Project project : allProjectsWithTeamLeader) {
if (project.getTeamLeader().getResponsibilities().size() > 0) {
responsibility = (String)project.getTeamLeader().getResponsibilities().iterator().next();
break;
}
}
Assert.assertTrue("Not a single teamLeader has any responsibilities!", responsibility != null);
String ejbqlString1 = "SELECT p FROM Project p WHERE p.teamLeader IS NOT NULL AND ?1 MEMBER OF p.teamLeader.responsibilities";
List result1 = em.createQuery(ejbqlString1).setParameter("1", responsibility).getResultList();
Assert.assertTrue("MEMBER OF result is empty", !result1.isEmpty());
String ejbqlString2 = "SELECT p FROM Project p WHERE p.teamLeader IS NOT NULL AND ?1 NOT MEMBER OF p.teamLeader.responsibilities";
List result2 = em.createQuery(ejbqlString2).setParameter("1", responsibility).getResultList();
Assert.assertTrue("NOT MEMBER OF result is empty", !result2.isEmpty());
List union = new ArrayList(result1);
union.addAll(result2);
Assert.assertTrue("Union of results of MEMBER OF and NON MEMBER OF not equal to all projects with team leaders", comparer.compareObjects(union, allProjectsWithTeamLeader));
for (int i=0; i < result2.size(); i++) {
if (result1.contains(result2.get(i))) {
fail("results of MEMBER OF and NON MEMBER OF intersect");
}
}
}
public void selectUsingLockModeQueryHintTest() {
Exception exception = null;
EntityManager em = createEntityManager();
Vector employees = getServerSession().readAllObjects(Employee.class);
Employee emp1 = (Employee)employees.lastElement();
Employee emp2 = new Employee();
try {
jakarta.persistence.Query query = em.createNamedQuery("findEmployeeByPK");
query.setParameter("id", emp1.getId());
query.setHint("lockMode", (short) 1);
emp2 = (Employee)query.getSingleResult();
} catch (Exception e) {
exception = e;
}
Assert.assertNull("An exception was caught: " + exception, exception);
Assert.assertTrue("The query did not return the same employee.", emp1.getId() == emp2.getId());
}
public void selectSimpleBetweenWithParameterTest() {
EntityManager em = createEntityManager();
Vector employees = getServerSession().readAllObjects(Employee.class);
BigDecimal empId1 = new BigDecimal(0);
Employee emp2 = (Employee)employees.lastElement();
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
ExpressionBuilder eb = new ExpressionBuilder();
Expression whereClause = eb.get("id").between(empId1, emp2.getId());
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "emp.id BETWEEN ?1 AND ?2";
List result = em.createQuery(ejbqlString).setParameter(1, empId1).setParameter(2, emp2.getId()).getResultList();
Assert.assertTrue("Simple select between with parameter test failed", comparer.compareObjects(result, expectedResult));
}
public void selectSimpleInWithParameterTest() {
EntityManager em = createEntityManager();
Vector employees = getServerSession().readAllObjects(Employee.class);
BigDecimal empId1 = new BigDecimal(0);
Employee emp2 = (Employee)employees.lastElement();
ReadAllQuery raq = new ReadAllQuery();
raq.setReferenceClass(Employee.class);
ExpressionBuilder eb = new ExpressionBuilder();
Vector vec = new Vector();
vec.add(empId1);
vec.add(emp2.getId());
Expression whereClause = eb.get("id").in(vec);
raq.setSelectionCriteria(whereClause);
Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
clearCache();
String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "emp.id IN (?1, ?2)";
List result = em.createQuery(ejbqlString).setParameter(1, empId1).setParameter(2, emp2.getId()).getResultList();
Assert.assertTrue("Simple select between with parameter test failed", comparer.compareObjects(result, expectedResult));
}
//Test case for ABS function in EJBQL
public void simpleEnumTest() {
EntityManager em = createEntityManager();
String ejbqlString;
ejbqlString = "SELECT emp FROM Employee emp WHERE ";
ejbqlString = ejbqlString + "emp.status = org.eclipse.persistence.testing.models.jpa.advanced.Employee.EmployeeStatus.FULL_TIME";
List result = em.createQuery(ejbqlString).getResultList();
result.size();
}
public void simpleTypeTest(){
EntityManager em = createEntityManager();
List expectedResult = getServerSession().readAllObjects(LargeProject.class);
clearCache();
String ejbqlString = "SELECT OBJECT(proj) FROM Project proj WHERE TYPE(proj) = LargeProject";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("SimpleTypeTest", comparer.compareObjects(result, expectedResult));
}
public void simpleAsOrderByTest(){
EntityManager em = createEntityManager();
ReportQuery query = new ReportQuery();
query.setReferenceClass(Employee.class);
query.addItem("firstName", query.getExpressionBuilder().get("firstName"));
query.returnSingleAttribute();
query.dontRetrievePrimaryKeys();
query.addOrdering(query.getExpressionBuilder().get("firstName").ascending());
Vector expectedResult = (Vector)getServerSession().executeQuery(query);
clearCache();
String ejbqlString = "SELECT e.firstName as firstName FROM Employee e ORDER BY firstName";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("SimpleTypeTest", comparer.compareObjects(result, expectedResult));
}
public void simpleLiteralDateTest(){
EntityManager em = createEntityManager();
Date date = Date.valueOf("1901-01-01");
Expression exp = (new ExpressionBuilder()).get("period").get("startDate").greaterThan(date);
List expectedResult = getServerSession().readAllObjects(Employee.class, exp);
clearCache();
String ejbqlString = "SELECT e FROM Employee e where e.period.startDate > {d '1901-01-01'}";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("simpleLiteralDateTest", comparer.compareObjects(result, expectedResult));
}
private void simpleLiteralLongTest(String numericalLiteral) {
EntityManager em = createEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.salary = 500000" + numericalLiteral);
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
for (Employee employee : results) {
assertEquals(500000, employee.getSalary());
}
}
public void simpleLiteralLongTest_Long1() {
simpleLiteralLongTest("l");
}
public void simpleLiteralLongTest_Long2() {
simpleLiteralLongTest("L");
}
public void simpleLiteralLongTest_Float1() {
simpleLiteralLongTest("f");
}
public void simpleLiteralLongTest_Float2() {
simpleLiteralLongTest("F");
}
public void simpleLiteralLongTest_Double1() {
simpleLiteralLongTest("d");
}
public void simpleLiteralLongTest_Double2() {
simpleLiteralLongTest("D");
}
public void simpleSingleArgSubstringTest(){
EntityManager em = createEntityManager();
Expression exp = (new ExpressionBuilder()).get("firstName").equal("Bob");
List expectedResult = getServerSession().readAllObjects(Employee.class, exp);
expectedResult.size();
clearCache();
String ejbqlString = "SELECT e FROM Employee e where substring(e.firstName, 2) = 'ob'";
List result = em.createQuery(ejbqlString).getResultList();
Assert.assertTrue("simpleSingleArgSubstringTest", comparer.compareObjects(result, expectedResult));
}
// bug 318195
public void elementCollectionIsNotEmptyTest(){
EntityManager em = createEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.responsibilities IS NOT EMPTY");
List results = query.getResultList();
Iterator i = results.iterator();
while (i.hasNext()){
Employee emp = (Employee)i.next();
assertTrue(emp.getResponsibilities() != null && !emp.getResponsibilities().isEmpty());
}
}
// bug 318195
public void relationshipElementCollectionIsNotEmptyTest(){
EntityManager em = createEntityManager();
Query query = em.createQuery("SELECT distinct o FROM PhoneNumber p join p.owner o WHERE o.responsibilities IS NOT EMPTY");
List results = query.getResultList();
Iterator i = results.iterator();
while (i.hasNext()){
Employee emp = (Employee)i.next();
assertTrue(emp.getResponsibilities() != null && !emp.getResponsibilities().isEmpty());
}
}
// Bug 332207
public void enumWithToStringTest(){
EntityManager em = createEntityManager();
beginTransaction(em);
Employee emp = new Employee();
emp.setFirstName("Nick");
emp.setPayScale(Employee.SalaryRate.SENIOR);
em.persist(emp);
em.flush();
em.clear();
clearCache();
Query query = em.createQuery("SELECT e from Employee e where e.payScale = org.eclipse.persistence.testing.models.jpa.advanced.Employee.SalaryRate.SENIOR");
emp = (Employee)query.getSingleResult();
assertTrue("Enumeration not properly returned", emp.getPayScale() == Employee.SalaryRate.SENIOR);
rollbackTransaction(em);
}
public void selectFromClauseWithFullyQualifiedClassName(){
EntityManager em = createEntityManager();
Query query = em.createQuery(
"SELECT e FROM org.eclipse.persistence.testing.models.jpa.advanced.Employee e, " +
"org.eclipse.persistence.testing.models.jpa.advanced.Address a "+
"WHERE e.lastName = 'JPQL'");
query.getResultList();
}
public void selectFromClauseWithTableName(){
EntityManager em = createEntityManager();
Query query = em.createQuery("select e from Employee e, table('CMP3_EMPLOYEE') EMP where e.lastName = EMP.L_NAME and EMP.EMP_ID = 100");
query.getResultList();
}
public void selectFromClauseWithJoin(){
EntityManager em = createEntityManager();
Query query = em.createQuery("SELECT Object(c) from Employee c JOIN FETCH c.address ");
query.getResultList();
}
/** Test for bug#378393 */
public void testMultipleSubqueries(){
EntityManager em = createEntityManager();
try {
Query query = em.createQuery(multipleSubqueries());
}
catch (Exception e) {
// JPQLException is not expected but I didn't write a contextually valid query
// so EL will complain about it, I needed to have multiple nested subqueries
// to verify the bug is indeed fixed
if (e instanceof JPQLException) {
throw (JPQLException) e;
}
}
// The query is not run because the JPQL query was
// migrated from the bug and cannot be executed
}
private String multipleSubqueries() {
return "select e_0 " +
"from Employee e_0 " +
"where e_0.hugeProject IN (select e_1.projects " +
" from PhoneNumber e_1 " +
" where e_1.owner IN (select e_2.employees " +
" from Address e_2 JOIN e_2.employees e" +
" where e.department IN (select e_3.department " +
" from Employee e_3 " +
" where lower(e_3.m_lastName) like :e_3_iStandid" +
" )" +
" )" +
" )";
}
/** Test for bug#379432 */
public void testDirectCollectionComparison() {
EntityManager em = createEntityManager();
Query query = em.createQuery("select b " +
"from Buyer as b, " +
" Employee as e join b.creditLines as logicalName " +
"where logicalName = e.firstName");
query.getResultList();
}
/** Test for bug#385629 */
public void simpleQueryWithFirstUnusedEntity() {
EntityManager em = createEntityManager();
Query query = em.createQuery("select b from Employee e, Buyer b");
List<?> resultList = query.getResultList();
assertFalse(resultList.isEmpty());
for (Object item : resultList) {
assertTrue(item instanceof org.eclipse.persistence.testing.models.jpa.advanced.Buyer);
}
}
/** Test for bug#404509 */
public void testSimpleGroupByOrderByClauses() {
EntityManager em = createEntityManager();
Query query = em.createQuery("select e.firstName from Employee e group by e.firstName order by e.firstName");
query.getResultList();
}
/**
* Test an ORDER BY with parentheses on an attribute, ascending
*/
public void testOrderByWithParenthesesAsc() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY (e.lastName) ASC");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY with parentheses on an attribute, descending
*/
public void testOrderByWithParenthesesDesc() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY (e.lastName) DESC");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY with parentheses on an attribute, no desc/asc
*/
public void testOrderByWithParenthesesDefault() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY (e.lastName)");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY with parentheses on a calculated value, ascending
*/
public void testOrderByWithParenthesesCalculatedAsc() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY (e.salary - e.version) ASC");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY with parentheses on a calculated value, descending
*/
public void testOrderByWithParenthesesCalculatedDesc() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY (e.salary - e.version) DESC");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY with parentheses on a calculated value, no asc/desc
*/
public void testOrderByWithParenthesesCalculatedDefault() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY (e.salary - e.version)");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY on an attribute, ascending, and with parentheses on a calculated value, ascending
*/
public void testOrderByWithParenthesesCalculatedAndNormalAsc() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.lastName ASC, (e.salary - e.version) ASC");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY on an attribute, descending, and with parentheses on a calculated value, descending
*/
public void testOrderByWithParenthesesCalculatedAndNormalDesc() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.lastName DESC, (e.salary - e.version) DESC");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY on an attribute, no asc/desc, and with parentheses on a calculated value, no asc/desc
*/
public void testOrderByWithParenthesesCalculatedAndNormalDefault() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.lastName, (e.salary - e.version)");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY on an attribute, no asc/desc, and with parentheses on a calculated value, descending
*/
public void testOrderByWithParenthesesCalculatedAndNormalHybrid() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.lastName, (e.salary - e.version) DESC");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY on multiple attributes with parentheses
*/
public void testOrderByWithParenthesesAllAttributes() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY (e.lastName), (e.firstName), (e.salary)");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
/**
* Test an ORDER BY on multiple attributes with parentheses, mixed asc/desc
*/
public void testOrderByWithParenthesesAllAttributesHybrid() {
EntityManager em = createEntityManager();
try {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY (e.lastName) ASC, (e.firstName), (e.salary) DESC");
List<Employee> results = query.getResultList();
assertFalse(results.isEmpty());
} finally {
closeEntityManager(em);
}
}
}