blob: 0312ae4ad35229b3d22ed537fd6adca3553da710 [file] [log] [blame]
/*
* Copyright (c) 2018, 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2018, 2021 IBM Corporation. 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/01/2018: Will Dazey
// - #253: Add support for embedded constructor results with CriteriaBuilder
package org.eclipse.persistence.jpa.test.criteria;
import java.util.ArrayList;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Query;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CompoundSelection;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.Root;
import org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl;
import org.eclipse.persistence.jpa.test.criteria.model.CriteriaCar;
import org.eclipse.persistence.jpa.test.criteria.model.CriteriaCar_;
import org.eclipse.persistence.jpa.test.criteria.model.L1;
import org.eclipse.persistence.jpa.test.criteria.model.L1Model;
import org.eclipse.persistence.jpa.test.criteria.model.L1_;
import org.eclipse.persistence.jpa.test.criteria.model.L2;
import org.eclipse.persistence.jpa.test.criteria.model.L2Model;
import org.eclipse.persistence.jpa.test.criteria.model.L2_;
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.platform.database.DatabasePlatform;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(EmfRunner.class)
public class TestCriteriaBuilder {
@Emf(createTables = DDLGen.DROP_CREATE, classes = { L1.class, L2.class, CriteriaCar.class })
private EntityManagerFactory emf;
/**
* Merging ElementCollections on Oracle fails when EclipseLink generates
* a DELETE SQL statement with a WHERE clause containing a CLOB.
*
*/
@Test
public void testCriteriaCompoundSelectionModel() throws Exception {
//Populate the database
EntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();
L2 l2 = new L2(1, "L2-1");
L2 l2_2 = new L2(2, "L2-2");
L1 l1 = new L1(1, "L1-1", l2);
L1 l1_2 = new L1(2, "L1-2", l2_2);
em.persist(l2);
em.persist(l2_2);
em.persist(l1);
em.persist(l1_2);
em.getTransaction().commit();
em.clear();
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if(em.isOpen()) {
em.close();
}
}
em = emf.createEntityManager();
try {
//Test CriteriaBuilder
final CriteriaBuilder builder = em.getCriteriaBuilder();
final CriteriaQuery<L1Model> query = builder.createQuery(L1Model.class);
final Root<L1> root = query.from(L1.class);
final Join<L1, L2> l1ToL2 = root.join(L1_.l2);
final CompoundSelection<L2Model> selection_l2 = builder.construct(L2Model.class, l1ToL2.get(L2_.id), l1ToL2.get(L2_.name));
final CompoundSelection<L1Model> selection = builder.construct(L1Model.class, root.get(L1_.id), root.get(L1_.name), selection_l2);
query.select(selection);
TypedQuery<L1Model> q = em.createQuery(query);
List<L1Model> l1List = q.getResultList();
if (l1List != null && !l1List.isEmpty()) {
for (L1Model l1m : l1List) {
Assert.assertNotNull(l1m.getL2());
}
}
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if(em.isOpen()) {
em.close();
}
}
}
@Test
public void testCriteriaBuilder_IN_ClauseLimit() throws Exception {
EntityManager em = emf.createEntityManager();
try {
//"SELECT OBJECT(emp) FROM Employee emp WHERE emp.id IN :result"
final CriteriaBuilder builder = em.getCriteriaBuilder();
final CriteriaQuery<L1> query = builder.createQuery(L1.class);
Root<L1> root = query.from(L1.class);
query.where(root.get("name").in(builder.parameter(List.class, "parameterList")));
Query q = em.createQuery(query);
//Create a list longer than the limit
int limit = getPlatform(emf).getINClauseLimit() + 10;
List<String> parameterList = new ArrayList<String>();
for(int p = 0; p < limit; p++) {
parameterList.add("" + p);
}
q.setParameter("parameterList", parameterList);
q.getResultList();
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if(em.isOpen()) {
em.close();
}
}
}
@Test
public void testCriteriaBuilder_NOTIN_ClauseLimit() throws Exception {
EntityManager em = emf.createEntityManager();
try {
//"SELECT OBJECT(emp) FROM Employee emp WHERE emp.id IN :result"
final CriteriaBuilder builder = em.getCriteriaBuilder();
final CriteriaQuery<L1> query = builder.createQuery(L1.class);
Root<L1> root = query.from(L1.class);
query.where(root.get("name").in(builder.parameter(List.class, "parameterList")).not());
Query q = em.createQuery(query);
//Create a list longer than the limit
int limit = getPlatform(emf).getINClauseLimit() + 10;
List<String> parameterList = new ArrayList<String>();
for(int p = 0; p < limit; p++) {
parameterList.add("" + p);
}
q.setParameter("parameterList", parameterList);
q.getResultList();
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if(em.isOpen()) {
em.close();
}
}
}
@Test
public void testCriteriaBuilder_ParameterInSelectClause() throws Exception {
EntityManager em = emf.createEntityManager();
try {
// First test JPQL
TypedQuery<Object[]> query = em.createQuery("SELECT c.id, ?1 FROM CriteriaCar c WHERE c.id = ?2", Object[].class);
query.setParameter(1, "TEST");
query.setParameter(2, "ID1");
query.getResultList();
final CriteriaBuilder criteriabuilder = em.getCriteriaBuilder();
final CriteriaQuery<Object[]> criteriaquery = criteriabuilder.createQuery(Object[].class);
Root<CriteriaCar> root = criteriaquery.from(CriteriaCar.class);
criteriaquery.multiselect(root.get(CriteriaCar_.id), criteriabuilder.parameter(String.class, "stringValue"));
criteriaquery.where(criteriabuilder.equal(root.get(CriteriaCar_.id), criteriabuilder.parameter(String.class, "idValue")));
query = em.createQuery(criteriaquery);
query.setParameter("stringValue", "TEST");
query.setParameter("idValue", "ID1");
query.getResultList();
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if(em.isOpen()) {
em.close();
}
}
}
private DatabasePlatform getPlatform(EntityManagerFactory emf) {
return ((EntityManagerFactoryImpl)emf).getServerSession().getPlatform();
}
}