package com.querydsl.jpa; import static com.querydsl.sql.SQLExpressions.select; import static org.junit.Assert.*; import java.sql.SQLException; import java.util.Arrays; import java.util.List; import java.util.UUID; import org.junit.Ignore; import org.junit.Test; import com.querydsl.core.QueryResults; import com.querydsl.core.Target; import com.querydsl.core.Tuple; import com.querydsl.core.testutil.ExcludeIn; import com.querydsl.core.types.Expression; import com.querydsl.core.types.Projections; import com.querydsl.core.types.SubQueryExpression; import com.querydsl.core.types.dsl.DateExpression; import com.querydsl.core.types.dsl.Wildcard; import com.querydsl.jpa.domain.Cat; import com.querydsl.jpa.domain.Color; import com.querydsl.jpa.domain.QCat; import com.querydsl.jpa.domain.QCompany; import com.querydsl.jpa.domain.sql.SAnimal; public abstract class AbstractSQLTest { protected static final SAnimal cat = new SAnimal("cat"); protected abstract AbstractSQLQuery<?,?> query(); public static class CatDTO { Cat cat; public CatDTO(Cat cat) { this.cat = cat; } } @Test public void count() { assertEquals(6L, query().from(cat).where(cat.dtype.eq("C")).fetchCount()); } @Test public void count_via_unique() { assertEquals(Long.valueOf(6), query().from(cat).where(cat.dtype.eq("C")) .select(cat.id.count()).fetchFirst()); } @Test public void countDistinct() { assertEquals(6L, query().from(cat).where(cat.dtype.eq("C")).distinct().fetchCount()); } @Test public void enum_binding() { List<Cat> cats = query().from(cat) .select(Projections.bean(Cat.class, QCat.cat.color)).fetch(); assertFalse(cats.isEmpty()); for (Cat cat : cats) { assertEquals(Color.BLACK, cat.getColor()); } } @Test @Ignore public void entityProjections() { List<Cat> cats = query().from(cat).orderBy(cat.name.asc()) .select(Projections.constructor(Cat.class, cat.name, cat.id)).fetch(); assertEquals(6, cats.size()); for (Cat c : cats) { assertNotNull(c.getName()); assertTrue(c.getId() > 0); } } @Test public void entityQueries() { QCat catEntity = QCat.cat; List<Cat> cats = query().from(cat).orderBy(cat.name.asc()).select(catEntity).fetch(); assertEquals(6, cats.size()); for (Cat c : cats) { assertNotNull(c.getName()); } } @Test public void entityQueries2() { SAnimal mate = new SAnimal("mate"); QCat catEntity = QCat.cat; List<Cat> cats = query().from(cat) .innerJoin(mate).on(cat.mateId.eq(mate.id)) .where(cat.dtype.eq("C"), mate.dtype.eq("C")) .select(catEntity).fetch(); assertTrue(cats.isEmpty()); } @Test public void entityQueries3() { QCat catEntity = new QCat("animal_"); assertEquals(0, query().from(catEntity).select(catEntity.toes.max()).fetchFirst().intValue()); } @Test @NoBatooJPA @NoEclipseLink public void entityQueries4() { QCat catEntity = QCat.cat; List<Tuple> cats = query().from(cat).select(catEntity, cat.name, cat.id).fetch(); assertEquals(6, cats.size()); for (Tuple tuple : cats) { assertTrue(tuple.get(catEntity) instanceof Cat); assertTrue(tuple.get(cat.name) instanceof String); assertTrue(tuple.get(cat.id) instanceof Integer); } } @Test @NoBatooJPA @NoEclipseLink public void entityQueries5() { QCat catEntity = QCat.cat; SAnimal otherCat = new SAnimal("otherCat"); QCat otherCatEntity = new QCat("otherCat"); List<Tuple> cats = query().from(cat, otherCat).select(catEntity, otherCatEntity).fetch(); assertEquals(36, cats.size()); for (Tuple tuple : cats) { assertTrue(tuple.get(catEntity) instanceof Cat); assertTrue(tuple.get(otherCatEntity) instanceof Cat); } } @Test @NoBatooJPA @NoEclipseLink public void entityQueries6() { QCat catEntity = QCat.cat; List<CatDTO> results = query().from(cat).select(Projections.constructor(CatDTO.class, catEntity)).fetch(); assertEquals(6, results.size()); for (CatDTO cat : results) { assertTrue(cat.cat instanceof Cat); } } @Test public void entityQueries7() { QCompany company = QCompany.company; assertEquals(Arrays.asList(), query().from(company).select(company.officialName).fetch()); } @Test public void in() { assertEquals(6L, query().from(cat).where(cat.dtype.in("C", "CX")).fetchCount()); } @Test public void limit_offset() { assertEquals(2, query().from(cat).orderBy(cat.id.asc()).limit(2).offset(2).select(cat.id, cat.name).fetch().size()); } @Test public void list() { assertEquals(6, query().from(cat).where(cat.dtype.eq("C")).select(cat.id).fetch().size()); } @Test public void list_limit_and_offset() { assertEquals(3, query().from(cat).orderBy(cat.id.asc()).offset(3).limit(3).select(cat.id).fetch().size()); } @Test public void list_limit_and_offset2() { List<Tuple> tuples = query().from(cat).orderBy(cat.id.asc()).offset(3).limit(3).select(cat.id, cat.name).fetch(); assertEquals(3, tuples.size()); assertEquals(2, tuples.get(0).size()); } @Test public void list_limit_and_offset3() { List<Tuple> tuples = query().from(cat).orderBy(cat.id.asc()).offset(3).limit(3).select(Projections.tuple(cat.id, cat.name)).fetch(); assertEquals(3, tuples.size()); assertEquals(2, tuples.get(0).size()); } @Test public void list_multiple() { print(query().from(cat).where(cat.dtype.eq("C")).select(cat.id, cat.name, cat.bodyWeight).fetch()); } @Test public void list_non_path() { assertEquals(6, query().from(cat).where(cat.dtype.eq("C")).select( cat.birthdate.year(), cat.birthdate.month(), cat.birthdate.dayOfMonth()).fetch().size()); } @Test public void list_results() { QueryResults<String> results = query().from(cat).limit(3).orderBy(cat.name.asc()) .select(cat.name).fetchResults(); assertEquals(Arrays.asList("Beck","Bobby","Harold"), results.getResults()); assertEquals(6L, results.getTotal()); } @Test @ExcludeIn(Target.H2) public void list_wildcard() { assertEquals(6, query().from(cat).where(cat.dtype.eq("C")).select(Wildcard.all).fetch().size()); } @Test public void list_with_count() { print(query().from(cat).where(cat.dtype.eq("C")).groupBy(cat.name) .select(cat.name, cat.id.count()).fetch()); } @Test public void list_with_limit() { assertEquals(3, query().from(cat).limit(3).select(cat.id).fetch().size()); } @Test @ExcludeIn({Target.H2, Target.MYSQL}) public void list_with_offset() { assertEquals(3, query().from(cat).orderBy(cat.id.asc()).offset(3).select(cat.id).fetch().size()); } @Test @ExcludeIn(Target.HSQLDB) public void no_from() { assertNotNull(query().select(DateExpression.currentDate()).fetchFirst()); } @Test public void null_as_uniqueResult() { assertNull(query().from(cat).where(cat.name.eq(UUID.randomUUID().toString())) .select(cat.name).fetchOne()); } private void print(Iterable<Tuple> rows) { for (Tuple row : rows) { System.out.println(row); } } @Test public void projections_duplicateColumns() { SAnimal cat = new SAnimal("cat"); assertEquals(1, query().from(cat).select(Projections.list(cat.count(), cat.count())).fetch().size()); } @Test public void single_result() { query().from(cat).select(cat.id).fetchFirst(); } @Test public void single_result_multiple() { assertEquals(1, query().from(cat).orderBy(cat.id.asc()).select(new Expression<?>[]{cat.id}).fetchFirst().get(cat.id).intValue()); } @Test @SuppressWarnings("unchecked") public void union() throws SQLException { SubQueryExpression<Integer> sq1 = select(cat.id.max()).from(cat); SubQueryExpression<Integer> sq2 = select(cat.id.min()).from(cat); List<Integer> list = query().union(sq1, sq2).list(); assertFalse(list.isEmpty()); } @Test @SuppressWarnings("unchecked") public void union_all() { SubQueryExpression<Integer> sq1 = select(cat.id.max()).from(cat); SubQueryExpression<Integer> sq2 = select(cat.id.min()).from(cat); List<Integer> list = query().unionAll(sq1, sq2).list(); assertFalse(list.isEmpty()); } @SuppressWarnings("unchecked") @Test @ExcludeIn({Target.DERBY, Target.POSTGRESQL}) @Ignore // FIXME public void union2() { List<Tuple> rows = query().union( select(cat.name, cat.id).from(cat).where(cat.name.eq("Beck")).distinct(), select(cat.name, null).from(cat).where(cat.name.eq("Kate")).distinct()) .list(); assertEquals(2, rows.size()); for (Tuple row : rows) { System.err.println(row); } } @SuppressWarnings("unchecked") @Test @ExcludeIn(Target.DERBY) @Ignore // FIXME public void union3() { SAnimal cat2 = new SAnimal("cat2"); List<Tuple> rows = query().union( select(cat.id, cat2.id).from(cat).innerJoin(cat2).on(cat2.id.eq(cat.id)), select(cat.id, null).from(cat)) .list(); assertEquals(12, rows.size()); int nulls = 0; for (Tuple row : rows) { System.err.println(Arrays.asList(row)); if (row.get(1, Object.class) == null) { nulls++; } } assertEquals(6, nulls); } @SuppressWarnings("unchecked") @Test @ExcludeIn({Target.DERBY, Target.POSTGRESQL}) @Ignore // FIXME public void union4() { query().union(cat, select(cat.name, cat.id).from(cat).where(cat.name.eq("Beck")).distinct(), select(cat.name, null).from(cat).where(cat.name.eq("Kate")).distinct()) .select(cat.name, cat.id).fetch(); } @SuppressWarnings("unchecked") @Test @ExcludeIn({Target.DERBY, Target.ORACLE}) public void union5() { SAnimal cat2 = new SAnimal("cat2"); List<Tuple> rows = query().union( select(cat.id, cat2.id).from(cat).join(cat2).on(cat2.id.eq(cat.id.add(1))), select(cat.id, cat2.id).from(cat).join(cat2).on(cat2.id.eq(cat.id.add(1)))) .list(); assertEquals(5, rows.size()); for (Tuple row : rows) { int first = row.get(cat.id); int second = row.get(cat2.id); assertEquals(first + 1, second); } } @Test public void unique_result() { assertEquals(1, query().from(cat).orderBy(cat.id.asc()).limit(1).select(cat.id).fetchOne().intValue()); } @Test public void unique_result_multiple() { assertEquals(1, query().from(cat).orderBy(cat.id.asc()).limit(1).select(new Expression<?>[]{cat.id}).fetchOne().get(cat.id).intValue()); } @Test @ExcludeIn(Target.H2) public void wildcard() { List<Tuple> rows = query().from(cat).select(cat.all()).fetch(); assertEquals(6, rows.size()); print(rows); // rows = query().from(cat).fetch(cat.id, cat.all()); // assertEquals(6, rows.size()); // print(rows); } }