| /* |
| * 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(); |
| } |
| } |