/* * Copyright 2014 - 2017 Blazebit. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.blazebit.persistence.testsuite; import com.blazebit.persistence.CriteriaBuilder; import com.blazebit.persistence.testsuite.base.category.NoEclipselink; import com.blazebit.persistence.testsuite.entity.Person; import com.blazebit.persistence.testsuite.tx.TxVoidWork; import org.junit.Test; import org.junit.experimental.categories.Category; import javax.persistence.EntityManager; import java.util.List; import static org.junit.Assert.assertEquals; /** * * @author Christian Beikov * @since 1.1.0 */ public class LimitTest extends AbstractCoreTest { @Override public void setUpOnce() { cleanDatabase(); transactional(new TxVoidWork() { @Override public void work(EntityManager em) { Person o1 = new Person("P1"); em.persist(o1); em.flush(); Person o2 = new Person("P2"); em.persist(o2); em.flush(); } }); } @Test @Category(NoEclipselink.class) // TODO: report eclipselink does not support subqueries in functions public void testSubqueryLimit() { CriteriaBuilder<Person> cb = cbf.create(em, Person.class, "p"); cb.where("p.id").in() .from(Person.class, "pSub") .select("pSub.id") .orderByAsc("pSub.id") .setMaxResults(1) .end(); String expected = "SELECT p FROM Person p WHERE p.id IN (" + function("LIMIT", "(SELECT pSub.id FROM Person pSub ORDER BY " + renderNullPrecedence("pSub.id", "ASC", "LAST") + ")", "1") + ")"; assertEquals(expected, cb.getQueryString()); List<Person> result = cb.getResultList(); assertEquals(1, result.size()); assertEquals("P1", result.get(0).getName()); } @Test @Category(NoEclipselink.class) // TODO: report eclipselink does not support subqueries in functions public void testSubqueryAndOuterQueryLimit() { CriteriaBuilder<Person> cb = cbf.create(em, Person.class, "p"); cb.where("p.id").in() .from(Person.class, "pSub") .select("pSub.id") .orderByAsc("pSub.id") .setMaxResults(2) .end() .orderByAsc("p.id") .setMaxResults(1); String expected = "SELECT p FROM Person p WHERE p.id IN (" + function("LIMIT", "(SELECT pSub.id FROM Person pSub ORDER BY " + renderNullPrecedence("pSub.id", "ASC", "LAST") + ")", "2") + ") ORDER BY " + renderNullPrecedence("p.id", "ASC", "LAST"); assertEquals(expected, cb.getQueryString()); List<Person> result = cb.getResultList(); assertEquals(1, result.size()); assertEquals("P1", result.get(0).getName()); } }