/* * Copyright 2015, The Querydsl Team (http://www.querydsl.com/team) * * 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.querydsl.jpa; import static com.querydsl.jpa.Constants.*; import static com.querydsl.jpa.JPAExpressions.*; import static org.junit.Assert.assertEquals; import org.junit.Test; import com.querydsl.core.domain.QCat; import com.querydsl.jpa.domain.QEmployee; import com.querydsl.jpa.domain.QUser; public class SubQueryTest extends AbstractQueryTest { @Test public void single_source() { JPQLQuery<?> query = selectFrom(cat); assertEquals("select cat\nfrom Cat cat", query.toString()); } @Test public void multiple_sources() { JPQLQuery<?> query = select(cat).from(cat, fatcat); assertEquals("select cat\nfrom Cat cat, Cat fatcat", query.toString()); } @Test public void in() { cat.in(selectFrom(cat)); } @Test public void innerJoin() { assertEquals("select cat\nfrom Cat cat\n inner join cat.mate", selectFrom(cat).innerJoin(cat.mate).toString()); } @Test public void innerJoin2() { QEmployee employee = QEmployee.employee; QUser user = QUser.user; assertEquals("select employee\nfrom Employee employee\n inner join employee.user as user", selectFrom(employee).innerJoin(employee.user, user).toString()); } @Test public void leftJoin() { assertEquals("select cat\nfrom Cat cat\n left join cat.mate", selectFrom(cat).leftJoin(cat.mate).toString()); } @Test public void join() { assertEquals("select cat\nfrom Cat cat\n inner join cat.mate", selectFrom(cat).join(cat.mate).toString()); } @Test public void uniqueProjection() { assertToString("(select cat from Cat cat)", selectFrom(cat)); } @Test public void listProjection() { assertToString("(select cat from Cat cat)", selectFrom(cat)); } @Test public void listContains() { assertToString("cat in (select cat from Cat cat)", cat.in(selectFrom(cat))); } @Test public void exists() { assertToString("exists (select 1 from Cat cat)", selectOne().from(cat).exists()); } @Test public void exists_where() { assertToString("exists (select 1 from Cat cat where cat.weight < ?1)", selectFrom(cat).where(cat.weight.lt(1)).exists()); } @Test public void exists_via_unique() { assertToString("exists (select 1 from Cat cat where cat.weight < ?1)", selectOne().from(cat).where(cat.weight.lt(1)).exists()); } @Test public void notExists() { assertToString("not exists (select 1 from Cat cat)", selectOne().from(cat).notExists()); } @Test public void notExists_where() { assertToString("not exists (select 1 from Cat cat where cat.weight < ?1)", selectOne().from(cat).where(cat.weight.lt(1)).notExists()); } @Test public void notExists_via_unique() { assertToString("not exists (select 1 from Cat cat where cat.weight < ?1)", selectOne().from(cat).where(cat.weight.lt(1)).notExists()); } @Test public void count() { assertToString("(select count(cat) from Cat cat)", select(cat.count()).from(cat)); } @Test public void count_via_list() { assertToString("(select count(cat) from Cat cat)", select(cat.count()).from(cat)); } @Test public void count_name() { assertToString("(select count(cat.name) from Cat cat)", select(cat.name.count()).from(cat)); } @Test public void count_multiple_sources() { QCat other = new QCat("other"); assertToString("(select count(cat) from Cat cat, Cat other)", select(cat.count()).from(cat, other)); } @Test public void count_multiple_sources_via_list() { QCat other = new QCat("other"); assertToString("(select count(cat) from Cat cat, Cat other)", select(cat.count()).from(cat, other)); } @Test public void indexed_access() { assertMatches("\\(select count\\(cat\\) from Cat cat " + "left join cat.kittens as cat_kittens_\\w+ " + "with index\\(cat_kittens_\\w+\\) = \\?1 where cat_kittens_\\w+.name = \\?2\\)", select(cat.count()).from(cat).where(cat.kittens.get(0).name.eq("Kate"))); } @Test public void indexed_access_without_constant() { assertMatches("\\(select count\\(cat\\) from Cat cat " + "left join cat.kittens as cat_kittens_\\w+ " + "with index\\(cat_kittens_\\w+\\) = cat.id where cat_kittens_\\w+.name = \\?1\\)", select(cat.count()).from(cat).where(cat.kittens.get(cat.id).name.eq("Kate"))); } @Test public void indexOf() { assertToString("(select count(cat) from Cat cat where locate(?1,cat.name)-1 = ?2)", select(cat.count()).from(cat).where(cat.name.indexOf("a").eq(1))); } // @Test // public void orderBy() { // JPQLQuery<Void> query = query().from(cat1).where(cat1.alive); // SubQueryExpression<Double> subquery = sub().from(cat).where(cat.mate.id.eq(cat1.id)).select(cat.floatProperty.avg()); // query.orderBy(subquery.subtract(-1.0f).asc()); // // assertEquals("select cat1 from Cat cat1 where cat1.alive order by (select avg(cat.floatProperty) from Cat cat where cat.mate.id = cat1.id) - ?1 asc", // query.toString().replace("\n", " ")); // } }