Skip to content

Commit

Permalink
jakartaee/persistence#438 - add Expression.equalTo() and Expression.n…
Browse files Browse the repository at this point in the history
…otEqualTo()

                            added to SubQueryImpl

Signed-off-by: Tomáš Kraus <[email protected]>
  • Loading branch information
Tomas-Kraus authored and lukasj committed Nov 7, 2023
1 parent b23ce44 commit 8d67d25
Show file tree
Hide file tree
Showing 9 changed files with 306 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -475,10 +475,7 @@ public class LoggingLocalizationResource extends ListResourceBundle {
{ "dbws_oxm_metadata_read_error", "The [{0}] OXM metadata could not be read."},
{ "dbws_no_wsdl_inline_schema", "The [{0}] WSDL inline schema could not be read."},
// JPA 3.2
{ "unknown_cacheRetrieveMode_type", "Unknown {0} type of jakarta.persistence.cache.retrieveMode property"},
{ "unknown_cacheStoreMode_type", "Unknown {0} type of jakarta.persistence.cache.storeMode property"},
{ "unknown_queryTimeoutUnit_type", "Unknown {0} type of eclipselink.query.timeout.unit property"},
{ "unknown_queryTimeout_type", "Unknown {0} type of jakarta.persistence.query.timeout property"},
{ "unknown_property_type", "Unknown {0} type of {1} persistence property"},
{ "error_queryTimeoutParse", "Could not parse jakarta.persistence.query.timeout property value {0}: {1}"},

{ "validate_object_space", "validate object space." },
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
/*
* Copyright (c) 1998, 2023 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:
// 10/25/2023: Tomas Kraus
// - New Jakarta Persistence 3.2 Features
package org.eclipse.persistence.jpa.test.query.model;

import java.util.List;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.ParameterExpression;
import jakarta.persistence.criteria.Root;
import org.eclipse.persistence.jpa.test.framework.DDLGen;
import org.eclipse.persistence.jpa.test.framework.Emf;
import org.eclipse.persistence.jpa.test.framework.EmfRunner;
import org.eclipse.persistence.jpa.test.framework.Property;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

@RunWith(EmfRunner.class)
public class TestQueryEqualTo {

@Emf(createTables = DDLGen.DROP_CREATE, classes = { EntityTbl01.class },
properties = { @Property(name="eclipselink.logging.level", value="FINE")})
private EntityManagerFactory emf;

private static boolean POPULATED = false;

@Test
public void testQueryEqualToExpression() {
if (!POPULATED)
populate();

EntityManager em = emf.createEntityManager();

try {
TypedQuery<String> query = em.createQuery(
"SELECT t.KeyString FROM EntityTbl01 t "
+ "WHERE t.KeyString = ?1", String.class);
query.setParameter(1, "EqualTo_1");
List<String> dto01 = query.getResultList();
assertNotNull(dto01);
assertEquals(1, dto01.size());

// equivalent CriteriaBuilder
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cquery = cb.createQuery(String.class);
Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
ParameterExpression<String> strParam1 = cb.parameter(String.class);
cquery.multiselect(root.get(EntityTbl01_.KeyString));
cquery.where(root.get(EntityTbl01_.KeyString).equalTo(strParam1));
query = em.createQuery(cquery);
query.setParameter(strParam1, "EqualTo_1");
dto01 = query.getResultList();
assertNotNull(dto01);
assertEquals(1, dto01.size());
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if(em.isOpen()) {
em.close();
}
}
}

@Test
public void testQueryEqualToObject() {
if (!POPULATED)
populate();

EntityManager em = emf.createEntityManager();

try {
TypedQuery<String> query = em.createQuery(
"SELECT t.KeyString FROM EntityTbl01 t "
+ "WHERE t.KeyString = 'EqualTo_2'", String.class);
List<String> dto01 = query.getResultList();
assertNotNull(dto01);
assertEquals(1, dto01.size());

// equivalent CriteriaBuilder
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cquery = cb.createQuery(String.class);
Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
cquery.multiselect(root.get(EntityTbl01_.KeyString));
cquery.where(root.get(EntityTbl01_.KeyString).equalTo("EqualTo_2"));
query = em.createQuery(cquery);
dto01 = query.getResultList();
assertNotNull(dto01);
assertEquals(1, dto01.size());
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if(em.isOpen()) {
em.close();
}
}
}

@Test
public void testQueryNotEqualToExpression() {
if (!POPULATED)
populate();

EntityManager em = emf.createEntityManager();

try {
TypedQuery<String> query = em.createQuery(
"SELECT t.KeyString FROM EntityTbl01 t "
+ "WHERE t.KeyString <> ?1", String.class);
query.setParameter(1, "EqualTo_3");
List<String> dto01 = query.getResultList();
assertNotNull(dto01);
assertTrue(dto01.size() > 1);

// equivalent CriteriaBuilder
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cquery = cb.createQuery(String.class);
Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
ParameterExpression<String> strParam1 = cb.parameter(String.class);
cquery.multiselect(root.get(EntityTbl01_.KeyString));
cquery.where(root.get(EntityTbl01_.KeyString).notEqualTo(strParam1));
query = em.createQuery(cquery);
query.setParameter(strParam1, "EqualTo_3");
dto01 = query.getResultList();
assertNotNull(dto01);
assertTrue(dto01.size() > 1);
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if(em.isOpen()) {
em.close();
}
}
}

@Test
public void testQueryNotEqualToObject() {
if (!POPULATED)
populate();

EntityManager em = emf.createEntityManager();

try {
TypedQuery<String> query = em.createQuery(
"SELECT t.KeyString FROM EntityTbl01 t "
+ "WHERE t.KeyString <> 'EqualTo_4'", String.class);
List<String> dto01 = query.getResultList();
assertNotNull(dto01);
assertTrue(dto01.size() > 1);

// equivalent CriteriaBuilder
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cquery = cb.createQuery(String.class);
Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
cquery.multiselect(root.get(EntityTbl01_.KeyString));
cquery.where(root.get(EntityTbl01_.KeyString).notEqualTo("EqualTo_4"));
query = em.createQuery(cquery);
dto01 = query.getResultList();
assertNotNull(dto01);
assertTrue(dto01.size() > 1);
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if(em.isOpen()) {
em.close();
}
}
}

private void populate() {
EntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();

EntityTbl01 tbl1 = new EntityTbl01();
tbl1.setKeyString("EqualTo_1");
tbl1.setItemString1("A");
tbl1.setItemString2(null);
tbl1.setItemString3("C");
tbl1.setItemString4("D");
tbl1.setItemInteger1(45);
em.persist(tbl1);

EntityTbl01 tbl2 = new EntityTbl01();
tbl2.setKeyString("EqualTo_2");
tbl2.setItemString1("A");
tbl2.setItemString2("B");
tbl2.setItemString3("C");
tbl2.setItemString4(null);
tbl2.setItemInteger1(83);
em.persist(tbl2);

EntityTbl01 tbl3 = new EntityTbl01();
tbl3.setKeyString("EqualTo_3");
tbl3.setItemString1(null);
tbl3.setItemString2("B");
tbl3.setItemString3("C");
tbl3.setItemString4("D");
tbl3.setItemInteger1(17);
em.persist(tbl3);

EntityTbl01 tbl4 = new EntityTbl01();
tbl4.setKeyString("EqualTo_4");
tbl4.setItemString1("A");
tbl4.setItemString2("B");
tbl4.setItemString3("C");
tbl4.setItemString4(null);
tbl4.setItemInteger1(29);
em.persist(tbl4);

em.getTransaction().commit();

POPULATED = true;
} finally {
if(em.isOpen()) {
em.close();
}
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,7 @@
import jakarta.persistence.Parameter;
import jakarta.persistence.PersistenceException;
import jakarta.persistence.TemporalType;
import jakarta.persistence.Timeout;
import jakarta.persistence.TypedQuery;

import org.eclipse.persistence.config.QueryHints;
import org.eclipse.persistence.exceptions.QueryException;
import org.eclipse.persistence.expressions.Expression;
import org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform;
Expand All @@ -56,8 +53,6 @@
import org.eclipse.persistence.internal.queries.JPQLCallQueryMechanism;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.jpa.JpaQuery;
import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.logging.SessionLog;
import org.eclipse.persistence.queries.Cursor;
import org.eclipse.persistence.queries.DataReadQuery;
import org.eclipse.persistence.queries.DatabaseQuery;
Expand Down Expand Up @@ -309,7 +304,7 @@ public EJBQueryImpl<X> setLockMode(LockModeType lockMode) {
// Based on EntityManagerImpl#getQueryHints(Object,OperationType)
@Override
public CacheRetrieveMode getCacheRetrieveMode() {
return FindOptionUtils.getCacheRetrieveMode(getDatabaseQuery().getProperties());
return FindOptionUtils.getCacheRetrieveMode(entityManager.getAbstractSession(), getDatabaseQuery().getProperties());
}

@Override
Expand All @@ -320,7 +315,7 @@ public TypedQuery<X> setCacheRetrieveMode(CacheRetrieveMode cacheRetrieveMode) {

@Override
public CacheStoreMode getCacheStoreMode() {
return FindOptionUtils.getCacheStoreMode(getDatabaseQuery().getProperties());
return FindOptionUtils.getCacheStoreMode(entityManager.getAbstractSession(), getDatabaseQuery().getProperties());
}

@Override
Expand All @@ -331,7 +326,7 @@ public TypedQuery<X> setCacheStoreMode(CacheStoreMode cacheStoreMode) {

@Override
public Integer getTimeout() {
return FindOptionUtils.getTimeout(getDatabaseQuery().getProperties());
return FindOptionUtils.getTimeout(entityManager.getAbstractSession(), getDatabaseQuery().getProperties());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2918,7 +2918,7 @@ public LockModeType getLockMode(Object entity) {

@Override
public CacheRetrieveMode getCacheRetrieveMode() {
return FindOptionUtils.getCacheRetrieveMode(properties);
return FindOptionUtils.getCacheRetrieveMode(getAbstractSession(), properties);
}

@Override
Expand All @@ -2928,7 +2928,7 @@ public void setCacheRetrieveMode(CacheRetrieveMode cacheRetrieveMode) {

@Override
public CacheStoreMode getCacheStoreMode() {
return FindOptionUtils.getCacheStoreMode(properties);
return FindOptionUtils.getCacheStoreMode(getAbstractSession(), properties);
}

@Override
Expand Down
Loading

0 comments on commit 8d67d25

Please sign in to comment.