/* * 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.core.Target.*; import static com.querydsl.jpa.JPAExpressions.select; import static org.junit.Assert.*; import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; import java.util.Calendar; import java.util.Map.Entry; import org.hamcrest.Matchers; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.joda.time.LocalTime; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.mysema.commons.lang.Pair; import com.querydsl.core.*; import com.querydsl.core.group.Group; import com.querydsl.core.group.GroupBy; import com.querydsl.core.group.QPair; import com.querydsl.core.group.MockTuple; import com.querydsl.core.testutil.ExcludeIn; import com.querydsl.core.types.*; import com.querydsl.core.types.dsl.*; import com.querydsl.jpa.domain.*; import com.querydsl.jpa.domain.Company.Rating; import com.querydsl.jpa.domain4.QBookMark; import com.querydsl.jpa.domain4.QBookVersion; import antlr.RecognitionException; import antlr.TokenStreamException; /** * @author tiwe * */ public abstract class AbstractJPATest { private static final Expression<?>[] NO_EXPRESSIONS = new Expression<?>[0]; private static final QCompany company = QCompany.company; private static final QAnimal animal = QAnimal.animal; private static final QCat cat = QCat.cat; private static final QCat otherCat = new QCat("otherCat"); private static final BooleanExpression cond1 = cat.name.length().gt(0); private static final BooleanExpression cond2 = otherCat.name.length().gt(0); private static final Predicate condition = ExpressionUtils.and( (Predicate) ExpressionUtils.extract(cond1), (Predicate) ExpressionUtils.extract(cond2)); private static final Date birthDate; private static final java.sql.Date date; private static final java.sql.Time time; private final List<Cat> savedCats = new ArrayList<Cat>(); static { Calendar cal = Calendar.getInstance(); cal.set(2000, 1, 2, 3, 4); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); birthDate = cal.getTime(); date = new java.sql.Date(cal.getTimeInMillis()); time = new java.sql.Time(cal.getTimeInMillis()); } protected Target getTarget() { return Mode.target.get(); } protected abstract JPQLQuery<?> query(); protected abstract JPQLQuery<?> testQuery(); protected abstract void save(Object entity); @Before public void setUp() { if (query().from(cat).fetchCount() > 0) { savedCats.addAll(query().from(cat).orderBy(cat.id.asc()).select(cat).fetch()); return; } Cat prev = null; for (Cat cat : Arrays.asList( new Cat("Bob123", 1, 1.0), new Cat("Ruth123", 2, 2.0), new Cat("Felix123", 3, 3.0), new Cat("Allen123", 4, 4.0), new Cat("Mary_123", 5, 5.0))) { if (prev != null) { cat.addKitten(prev); } cat.setBirthdate(birthDate); cat.setDateField(date); cat.setTimeField(time); cat.setColor(Color.BLACK); cat.setMate(prev); save(cat); savedCats.add(cat); prev = cat; } Animal animal = new Animal(10); animal.setBodyWeight(10.5); save(animal); Cat cat = new Cat("Some", 6, 6.0); cat.setBirthdate(birthDate); save(cat); savedCats.add(cat); Show show = new Show(1); show.acts = new HashMap<String,String>(); show.acts.put("a","A"); show.acts.put("b","B"); save(show); Company company = new Company(); company.name = "1234567890123456789012345678901234567890"; // 40 company.id = 1; company.ratingOrdinal = Company.Rating.A; company.ratingString = Company.Rating.AA; save(company); Employee employee = new Employee(); employee.id = 1; employee.lastName = "Smith"; employee.jobFunctions.add(JobFunction.CODER); save(employee); Employee employee2 = new Employee(); employee2.id = 2; employee2.lastName = "Doe"; employee2.jobFunctions.add(JobFunction.CODER); employee2.jobFunctions.add(JobFunction.CONSULTANT); employee2.jobFunctions.add(JobFunction.CONTROLLER); save(employee2); save(new Entity1(1)); save(new Entity1(2)); save(new Entity2(3)); Foo foo = new Foo(); foo.id = 1; foo.names = Arrays.asList("a","b"); foo.bar = "München"; save(foo); Numeric numeric = new Numeric(); numeric.setValue(BigDecimal.valueOf(26.9)); save(numeric); } @Test @ExcludeIn(ORACLE) public void add_bigDecimal() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); NumberPath<BigDecimal> bigd1 = entity.bigDecimal; NumberPath<BigDecimal> bigd2 = entity2.bigDecimal; assertEquals(Arrays.asList(), query().from(entity, entity2) .where(bigd1.add(bigd2).loe(new BigDecimal("1.00"))) .select(entity).fetch()); } @Test public void aggregates_list_max() { assertEquals(Integer.valueOf(6), query().from(cat).select(cat.id.max()).fetchFirst()); } @Test public void aggregates_list_min() { assertEquals(Integer.valueOf(1), query().from(cat).select(cat.id.min()).fetchFirst()); } @Test public void aggregates_uniqueResult_max() { assertEquals(Integer.valueOf(6), query().from(cat).select(cat.id.max()).fetchFirst()); } @Test public void aggregates_uniqueResult_min() { assertEquals(Integer.valueOf(1), query().from(cat).select(cat.id.min()).fetchFirst()); } @Test public void alias() { assertEquals(6, query().from(cat).select(cat.id.as(cat.id)).fetch().size()); } @Test public void any_and_gt() { assertEquals(0, query().from(cat).where( cat.kittens.any().name.eq("Ruth123"), cat.kittens.any().bodyWeight.gt(10.0)).fetchCount()); } @Test public void any_and_lt() { assertEquals(1, query().from(cat).where( cat.kittens.any().name.eq("Ruth123"), cat.kittens.any().bodyWeight.lt(10.0)).fetchCount()); } @Test public void any_in_order() { assertFalse(query().from(cat).orderBy(cat.kittens.any().name.asc()).select(cat).fetch().isEmpty()); } @Test public void any_in_projection() { assertFalse(query().from(cat).select(cat.kittens.any()).fetch().isEmpty()); } @Test public void any_in_projection2() { assertFalse(query().from(cat).select(cat.kittens.any().name).fetch().isEmpty()); } @Test public void any_in_projection3() { assertFalse(query().from(cat).select(cat.kittens.any().name, cat.kittens.any().bodyWeight).fetch().isEmpty()); } @Test public void any_in1() { //select cat from Cat cat where exists ( // select cat_kittens from Cat cat_kittens where cat_kittens member of cat.kittens and cat_kittens in ?1) assertFalse(query().from(cat).where(cat.kittens.any().in(savedCats)).select(cat).fetch().isEmpty()); } @Test public void any_in11() { List<Integer> ids = Lists.newArrayList(); for (Cat cat : savedCats) { ids.add(cat.getId()); } assertFalse(query().from(cat).where(cat.kittens.any().id.in(ids)).select(cat).fetch().isEmpty()); } @Test public void any_in2() { assertFalse(query().from(cat).where( cat.kittens.any().in(savedCats), cat.kittens.any().in(savedCats.subList(0, 1)).not()) .select(cat).fetch().isEmpty()); } @Test @NoBatooJPA public void any_in3() { QEmployee employee = QEmployee.employee; assertFalse(query().from(employee).where( employee.jobFunctions.any().in(JobFunction.CODER, JobFunction.CONSULTANT)) .select(employee).fetch().isEmpty()); } @Test public void any_simple() { assertEquals(1, query().from(cat).where(cat.kittens.any().name.eq("Ruth123")).fetchCount()); } @Test public void any_any() { assertEquals(1, query().from(cat).where(cat.kittens.any().kittens.any().name.eq("Ruth123")).fetchCount()); } @SuppressWarnings("unchecked") @Test public void arrayProjection() { List<String[]> results = query().from(cat) .select(new ArrayConstructorExpression<String>(String[].class, cat.name)).fetch(); assertFalse(results.isEmpty()); for (String[] result : results) { assertNotNull(result[0]); } } @Test public void as() { assertTrue(query().from(QAnimal.animal.as(QCat.class)).fetchCount() > 0); } @Test public void between() { assertEquals(ImmutableList.of(2, 3, 4, 5), query().from(cat).where(cat.id.between(2, 5)).orderBy(cat.id.asc()).select(cat.id).fetch()); } @Test @NoBatooJPA public void case1() { assertEquals(ImmutableList.of(1, 2, 2, 2, 2, 2), query().from(cat).orderBy(cat.id.asc()) .select(cat.name.when("Bob123").then(1).otherwise(2)).fetch()); } @Test @NoBatooJPA public void case1_long() { assertEquals(ImmutableList.of(1L, 2L, 2L, 2L, 2L, 2L), query().from(cat).orderBy(cat.id.asc()) .select(cat.name.when("Bob123").then(1L).otherwise(2L)).fetch()); List<Integer> rv = query().from(cat).select(cat.name.when("Bob").then(1).otherwise(2)).fetch(); assertInstancesOf(Integer.class, rv); } @Test @NoEclipseLink @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 public void case1_date() { List<LocalDate> rv = query().from(cat).select(cat.name.when("Bob").then(new LocalDate()) .otherwise(new LocalDate().plusDays(1))).fetch(); assertInstancesOf(LocalDate.class, rv); } @Test @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 @NoEclipseLink({MYSQL, POSTGRESQL}) public void case1_date2() { List<java.sql.Date> rv = query().from(cat).select(cat.name.when("Bob").then(new java.sql.Date(0)) .otherwise(new java.sql.Date(0))).fetch(); assertInstancesOf(java.sql.Date.class, rv); } @Test @NoEclipseLink @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 public void case1_time() { List<LocalTime> rv = query().from(cat).select(cat.name.when("Bob").then(new LocalTime()) .otherwise(new LocalTime().plusHours(1))).fetch(); assertInstancesOf(LocalTime.class, rv); } @Test @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 @NoEclipseLink({MYSQL, POSTGRESQL}) public void case1_time2() { List<java.sql.Time> rv = query().from(cat).select(cat.name.when("Bob").then(new java.sql.Time(0)) .otherwise(new java.sql.Time(0))).fetch(); assertInstancesOf(java.sql.Time.class, rv); } @Test @NoEclipseLink @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 public void case1_timestamp() { List<DateTime> rv = query().from(cat).select(cat.name.when("Bob").then(new DateTime()) .otherwise(new DateTime().plusHours(1))).fetch(); assertInstancesOf(DateTime.class, rv); } @Test @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 @NoEclipseLink({MYSQL, POSTGRESQL}) public void case1_timestamp2() { List<java.sql.Timestamp> rv = query().from(cat).select(cat.name.when("Bob").then(new java.sql.Timestamp(0)) .otherwise(new java.sql.Timestamp(0))).fetch(); assertInstancesOf(java.sql.Timestamp.class, rv); } @Test public void case2() { assertEquals(ImmutableList.of(4, 4, 4, 4, 4, 4), query().from(cat) .select(Expressions.cases().when(cat.toes.eq(2)).then(cat.id.multiply(2)) .when(cat.toes.eq(3)).then(cat.id.multiply(3)) .otherwise(4)).fetch()); } @Test public void case3() { assertEquals(ImmutableList.of(4, 4, 4, 4, 4, 4), query().from(cat).select(Expressions.cases() .when(cat.toes.in(2, 3)).then(cat.id.multiply(cat.toes)) .otherwise(4)).fetch()); } @Test @ExcludeIn(MYSQL) // doesn't work in Eclipselink public void case4() { NumberExpression<Float> numExpression = cat.bodyWeight.floatValue().divide(otherCat.bodyWeight.floatValue()).multiply(100); NumberExpression<Float> numExpression2 = cat.id.when(0).then(0.0F).otherwise(numExpression); assertEquals(ImmutableList.of(200, 150, 133, 125, 120), query().from(cat, otherCat) .where(cat.id.eq(otherCat.id.add(1))) .orderBy(cat.id.asc(), otherCat.id.asc()) .select(numExpression2.intValue()).fetch()); } @Test @NoEclipseLink // EclipseLink uses a left join for cat.mate public void case5() { assertEquals(ImmutableList.of(0, 1, 1, 1), query().from(cat).orderBy(cat.id.asc()) .select(cat.mate.when(savedCats.get(0)).then(0).otherwise(1)).fetch()); } private static <T> void assertInstancesOf(Class<T> clazz, Iterable<T> rows) { for (T row : rows) { assertEquals(row.toString(), clazz, row.getClass()); } } @Test public void caseBuilder() { QCat cat2 = new QCat("cat2"); NumberExpression<Integer> casex = new CaseBuilder() .when(cat.weight.isNull().and(cat.weight.isNull())).then(0) .when(cat.weight.isNull()).then(cat2.weight) .when(cat2.weight.isNull()).then(cat.weight) .otherwise(cat.weight.add(cat2.weight)); query().from(cat, cat2).orderBy(casex.asc()).select(cat.id, cat2.id).fetch(); query().from(cat, cat2).orderBy(casex.desc()).select(cat.id, cat2.id).fetch(); } @Test public void cast() { List<Cat> cats = query().from(cat).select(cat).fetch(); List<Integer> weights = query().from(cat).select(cat.bodyWeight.castToNum(Integer.class)).fetch(); for (int i = 0; i < cats.size(); i++) { assertEquals(Integer.valueOf((int) (cats.get(i).getBodyWeight())), weights.get(i)); } } @Test @ExcludeIn(SQLSERVER) public void cast_toString() { for (Tuple tuple : query().from(cat).select(cat.breed, cat.breed.stringValue()).fetch()) { assertEquals( tuple.get(cat.breed).toString(), tuple.get(cat.breed.stringValue())); } } @Test @ExcludeIn(SQLSERVER) public void cast_toString_append() { for (Tuple tuple : query().from(cat).select(cat.breed, cat.breed.stringValue().append("test")).fetch()) { assertEquals( tuple.get(cat.breed).toString() + "test", tuple.get(cat.breed.stringValue().append("test"))); } } @Test public void collection_predicates() { ListPath<Cat, QCat> path = cat.kittens; List<Predicate> predicates = Arrays.asList( // path.eq(savedCats), // path.in(savedCats), // path.isNotNull(), // path.isNull(), // path.ne(savedCats), // path.notIn(savedCats) // path.when(other) ); for (Predicate pred : predicates) { System.err.println(pred); query().from(cat).where(pred).select(cat).fetch(); } } @Test public void collection_projections() { ListPath<Cat, QCat> path = cat.kittens; List<Expression<?>> projections = Arrays.asList( // path.fetchCount(), // path.countDistinct() ); for (Expression<?> proj : projections) { System.err.println(proj); query().from(cat).select(proj).fetch(); } } @Test public void constant() { //select cat.id, ?1 as const from Cat cat List<Cat> cats = query().from(cat).select(cat).fetch(); Path<String> path = Expressions.stringPath("const"); List<Tuple> tuples = query().from(cat).select(cat.id, Expressions.constantAs("abc", path)).fetch(); for (int i = 0; i < cats.size(); i++) { assertEquals(Integer.valueOf(cats.get(i).getId()), tuples.get(i).get(cat.id)); assertEquals("abc", tuples.get(i).get(path)); } } @Test public void constant2() { assertFalse(query().from(cat).select(cat.id, Expressions.constant("name")).fetch().isEmpty()); } @Test public void constructorProjection() { List<Projection> projections = query().from(cat) .select(Projections.constructor(Projection.class, cat.name, cat)).fetch(); assertFalse(projections.isEmpty()); for (Projection projection : projections) { assertNotNull(projection); } } @Test public void constructorProjection2() { List<Projection> projections = query().from(cat).select(new QProjection(cat.name, cat)).fetch(); assertFalse(projections.isEmpty()); for (Projection projection : projections) { assertNotNull(projection); } } @Test public void constructorProjection3() { List<Projection> projections = query().from(cat).select(new QProjection(cat.id, Expressions.FALSE)).fetch(); assertFalse(projections.isEmpty()); for (Projection projection : projections) { assertNotNull(projection); } } @Test public void contains_ic() { QFoo foo = QFoo.foo; assertEquals(1, query().from(foo).where(foo.bar.containsIgnoreCase("München")).fetchCount()); } @Test public void contains1() { assertEquals(1, query().from(cat).where(cat.name.contains("eli")).fetchCount()); } @Test public void contains2() { assertEquals(1L, query().from(cat).where(cat.kittens.contains(savedCats.get(0))).fetchCount()); } @Test public void contains3() { assertEquals(1L, query().from(cat).where(cat.name.contains("_")).fetchCount()); } @Test public void contains4() { QEmployee employee = QEmployee.employee; assertEquals(Arrays.asList(), query().from(employee) .where( employee.jobFunctions.contains(JobFunction.CODER), employee.jobFunctions.contains(JobFunction.CONSULTANT), employee.jobFunctions.size().eq(2)) .select(employee).fetch()); } @Test public void count() { QShow show = QShow.show; assertTrue(query().from(show).fetchCount() > 0); } @Test public void count_distinct() { QCat cat = QCat.cat; query().from(cat) .groupBy(cat.id) .select(cat.id, cat.breed.countDistinct()).fetch(); } @Test @NoBatooJPA @NoHibernate public void count_distinct2() { QCat cat = QCat.cat; query().from(cat) .groupBy(cat.id) .select(cat.id, cat.birthdate.dayOfMonth().countDistinct()).fetch(); } @Test @NoEclipseLink public void distinct_orderBy() { QCat cat = QCat.cat; List<Tuple> result = query().select(cat.id, cat.mate.id) .distinct() .from(cat) .orderBy( cat.mate.id.asc().nullsFirst(), cat.id.asc().nullsFirst() ).fetch(); assertThat(result, Matchers.<Tuple>contains( new MockTuple(new Object[]{1, null}), new MockTuple(new Object[]{6, null}), new MockTuple(new Object[]{2, 1}), new MockTuple(new Object[]{3, 2}), new MockTuple(new Object[]{4, 3}), new MockTuple(new Object[]{5, 4}) )); } @Test @NoHibernate @ExcludeIn(MYSQL) public void distinct_orderBy2() { QCat cat = QCat.cat; List<Tuple> result = query().select(cat.id, cat.mate.id) .distinct() .from(cat) .orderBy(cat.mate.id.asc().nullsFirst()).fetch(); assertThat(result, Matchers.<Tuple>contains( new MockTuple(new Object[]{2, 1}), new MockTuple(new Object[]{3, 2}), new MockTuple(new Object[]{4, 3}), new MockTuple(new Object[]{5, 4}) )); } @Test @NoEclipseLink(HSQLDB) public void count_distinct3() { QCat kitten = new QCat("kitten"); assertEquals(4, query().from(cat).leftJoin(cat.kittens, kitten).select(kitten.countDistinct()).fetchOne().intValue()); assertEquals(6, query().from(cat).leftJoin(cat.kittens, kitten).select(kitten.countDistinct()).fetchCount()); } @Test public void distinctResults() { System.out.println("-- fetch results"); QueryResults<Date> res = query().from(cat).limit(2).select(cat.birthdate).fetchResults(); assertEquals(2, res.getResults().size()); assertEquals(6L, res.getTotal()); System.out.println(); System.out.println("-- fetch distinct results"); res = query().from(cat).limit(2).distinct().select(cat.birthdate).fetchResults(); assertEquals(1, res.getResults().size()); assertEquals(1L, res.getTotal()); System.out.println(); System.out.println("-- fetch distinct"); assertEquals(1, query().from(cat).distinct().select(cat.birthdate).fetch().size()); } @Test public void date() { assertEquals(2000, query().from(cat).select(cat.birthdate.year()).fetchFirst().intValue()); assertEquals(200002, query().from(cat).select(cat.birthdate.yearMonth()).fetchFirst().intValue()); assertEquals(2, query().from(cat).select(cat.birthdate.month()).fetchFirst().intValue()); assertEquals(2, query().from(cat).select(cat.birthdate.dayOfMonth()).fetchFirst().intValue()); assertEquals(3, query().from(cat).select(cat.birthdate.hour()).fetchFirst().intValue()); assertEquals(4, query().from(cat).select(cat.birthdate.minute()).fetchFirst().intValue()); assertEquals(0, query().from(cat).select(cat.birthdate.second()).fetchFirst().intValue()); } @Test @NoEclipseLink({DERBY, HSQLDB}) @NoHibernate({DERBY, POSTGRESQL, SQLSERVER}) public void date_yearWeek() { int value = query().from(cat).select(cat.birthdate.yearWeek()).fetchFirst(); assertTrue(value == 200006 || value == 200005); } @Test @NoEclipseLink({DERBY, HSQLDB}) @NoHibernate({DERBY, POSTGRESQL, SQLSERVER}) public void date_week() { int value = query().from(cat).select(cat.birthdate.week()).fetchFirst(); assertTrue(value == 6 || value == 5); } @Test @ExcludeIn(ORACLE) public void divide() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); assertEquals(Arrays.asList(), query().from(entity, entity2) .where(entity.ddouble.divide(entity2.ddouble).loe(2.0)) .select(entity).fetch()); assertEquals(Arrays.asList(), query().from(entity, entity2) .where(entity.ddouble.divide(entity2.iint).loe(2.0)) .select(entity).fetch()); assertEquals(Arrays.asList(), query().from(entity, entity2) .where(entity.iint.divide(entity2.ddouble).loe(2.0)) .select(entity).fetch()); assertEquals(Arrays.asList(), query().from(entity, entity2) .where(entity.iint.divide(entity2.iint).loe(2)) .select(entity).fetch()); } @Test @ExcludeIn(ORACLE) public void divide_bigDecimal() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); NumberPath<BigDecimal> bigd1 = entity.bigDecimal; NumberPath<BigDecimal> bigd2 = entity2.bigDecimal; assertEquals(Arrays.asList(), query().from(entity, entity2) .where(bigd1.divide(bigd2).loe(new BigDecimal("1.00"))) .select(entity).fetch()); assertEquals(Arrays.asList(), query().from(entity, entity2) .where(entity.ddouble.divide(bigd2).loe(new BigDecimal("1.00"))) .select(entity).fetch()); assertEquals(Arrays.asList(), query().from(entity, entity2) .where(bigd1.divide(entity.ddouble).loe(new BigDecimal("1.00"))) .select(entity).fetch()); } @Test public void endsWith() { assertEquals(1, query().from(cat).where(cat.name.endsWith("h123")).fetchCount()); } @Test public void endsWith_ignoreCase() { assertEquals(1, query().from(cat).where(cat.name.endsWithIgnoreCase("H123")).fetchCount()); } @Test public void endsWith2() { assertEquals(0, query().from(cat).where(cat.name.endsWith("X")).fetchCount()); } @Test public void endsWith3() { assertEquals(1, query().from(cat).where(cat.name.endsWith("_123")).fetchCount()); } @Test @NoBatooJPA public void enum_eq() { assertEquals(1, query().from(company).where(company.ratingOrdinal.eq(Rating.A)).fetchCount()); assertEquals(1, query().from(company).where(company.ratingString.eq(Rating.AA)).fetchCount()); } @Test @NoBatooJPA public void enum_in() { assertEquals(1, query().from(company).where(company.ratingOrdinal.in(Rating.A, Rating.AA)).fetchCount()); assertEquals(1, query().from(company).where(company.ratingString.in(Rating.A, Rating.AA)).fetchCount()); } @Test @NoBatooJPA public void enum_in2() { QEmployee employee = QEmployee.employee; JPQLQuery<?> query = query(); query.from(employee).where(employee.lastName.eq("Smith"), employee.jobFunctions .contains(JobFunction.CODER)); assertEquals(1L, query.fetchCount()); } @Test @ExcludeIn(SQLSERVER) public void enum_startsWith() { assertEquals(1, query().from(company).where(company.ratingString.stringValue().startsWith("A")).fetchCount()); } @Test @NoEclipseLink(HSQLDB) public void factoryExpressions() { QCat cat = QCat.cat; QCat cat2 = new QCat("cat2"); QCat kitten = new QCat("kitten"); JPQLQuery<Tuple> query = query().from(cat) .leftJoin(cat.mate, cat2) .leftJoin(cat2.kittens, kitten) .select(Projections.tuple(cat.id, new QFamily(cat, cat2, kitten).skipNulls())); assertEquals(6, query.fetch().size()); assertNotNull(query.limit(1).fetchOne()); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void fetch() { QMammal mammal = QMammal.mammal; QHuman human = new QHuman("mammal"); query().from(mammal) .leftJoin(human.hairs).fetchJoin() .select(mammal).fetch(); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void fetch2() { QWorld world = QWorld.world; QMammal mammal = QMammal.mammal; QHuman human = new QHuman("mammal"); query().from(world) .leftJoin(world.mammals, mammal).fetchJoin() .leftJoin(human.hairs).fetchJoin() .select(world).fetch(); } @Test @ExcludeIn({MYSQL, DERBY}) @NoBatooJPA public void groupBy() { QAuthor author = QAuthor.author; QBook book = QBook.book; for (int i = 0; i < 10; i++) { Author a = new Author(); a.setName(String.valueOf(i)); save(a); for (int j = 0; j < 2; j++) { Book b = new Book(); b.setTitle(String.valueOf(i) + " " + String.valueOf(j)); b.setAuthor(a); save(b); } } Map<Long, List<Pair<Long, String>>> map = query() .from(author) .join(author.books, book) .transform(GroupBy .groupBy(author.id) .as(GroupBy.list(QPair.create(book.id, book.title)))); for (Entry<Long, List<Pair<Long, String>>> entry : map.entrySet()) { System.out.println("author = " + entry.getKey()); for (Pair<Long,String> pair : entry.getValue()) { System.out.println(" book = " + pair.getFirst() + "," + pair.getSecond()); } } } @Test public void groupBy2() { // select cat0_.name as col_0_0_, cat0_.breed as col_1_0_, sum(cat0_.bodyWeight) as col_2_0_ // from animal_ cat0_ where cat0_.DTYPE in ('C', 'DC') and cat0_.bodyWeight>? // group by cat0_.name , cat0_.breed query().from(cat) .where(cat.bodyWeight.gt(0)) .groupBy(cat.name, cat.breed) .select(cat.name, cat.breed, cat.bodyWeight.sum()).fetch(); } @Test @NoEclipseLink public void groupBy_yearMonth() { query().from(cat) .groupBy(cat.birthdate.yearMonth()) .orderBy(cat.birthdate.yearMonth().asc()) .select(cat.id.count()).fetch(); } @Test @Ignore // FIXME public void groupBy_count() { List<Integer> ids = query().from(cat).groupBy(cat.id).select(cat.id).fetch(); long count = query().from(cat).groupBy(cat.id).fetchCount(); QueryResults<Integer> results = query().from(cat).groupBy(cat.id) .limit(1).select(cat.id).fetchResults(); long catCount = query().from(cat).fetchCount(); assertEquals(catCount, ids.size()); assertEquals(catCount, count); assertEquals(catCount, results.getResults().size()); assertEquals(catCount, results.getTotal()); } @Test @Ignore // FIXME public void groupBy_distinct_count() { List<Integer> ids = query().from(cat).groupBy(cat.id).distinct().select(Expressions.ONE).fetch(); QueryResults<Integer> results = query().from(cat).groupBy(cat.id) .limit(1).distinct().select(Expressions.ONE).fetchResults(); assertEquals(1, ids.size()); assertEquals(1, results.getResults().size()); assertEquals(1, results.getTotal()); } @Test @NoHibernate // https://hibernate.atlassian.net/browse/HHH-1902 public void groupBy_select() { // select length(my_column) as column_size from my_table group by column_size NumberPath<Integer> length = Expressions.numberPath(Integer.class, "len"); assertEquals(ImmutableList.of(4, 6, 7, 8), query().select(cat.name.length().as(length)).from(cat).orderBy(length.asc()).groupBy(length).fetch()); } @Test public void groupBy_results() { QueryResults<Integer> results = query().from(cat).groupBy(cat.id).select(cat.id).fetchResults(); assertEquals(6, results.getTotal()); assertEquals(6, results.getResults().size()); } @Test public void groupBy_results2() { QueryResults<Integer> results = query().from(cat).groupBy(cat.birthdate).select(cat.id.max()).fetchResults(); assertEquals(1, results.getTotal()); assertEquals(1, results.getResults().size()); } @Test public void in() { assertEquals(3L, query().from(cat).where(cat.name.in("Bob123", "Ruth123", "Felix123")).fetchCount()); assertEquals(3L, query().from(cat).where(cat.id.in(Arrays.asList(1, 2, 3))).fetchCount()); assertEquals(0L, query().from(cat).where(cat.name.in(Arrays.asList("A", "B", "C"))).fetchCount()); } @Test public void in2() { assertEquals(3L, query().from(cat).where(cat.id.in(1, 2, 3)).fetchCount()); assertEquals(0L, query().from(cat).where(cat.name.in("A", "B", "C")).fetchCount()); } @Test public void in3() { assertEquals(0, query().from(cat).where(cat.name.in("A,B,C".split(","))).fetchCount()); } @Test public void in4() { //$.parameterRelease.id.eq(releaseId).and($.parameterGroups.any().id.in(filter.getGroups())); assertEquals(Arrays.asList(), query().from(cat).where(cat.id.eq(1), cat.kittens.any().id.in(1, 2, 3)).select(cat).fetch()); } @Test public void in5() { assertEquals(4L, query().from(cat).where(cat.mate.in(savedCats)).fetchCount()); } @Test @Ignore public void in6() { //query().from(cat).where(cat.kittens.in(savedCats)).fetchCount(); } @Test public void in7() { assertEquals(4L, query().from(cat).where(cat.kittens.any().in(savedCats)).fetchCount()); } @Test public void in_empty() { assertEquals(0, query().from(cat).where(cat.name.in(ImmutableList.<String>of())).fetchCount()); } @Test @NoOpenJPA public void indexOf() { assertEquals(Integer.valueOf(0), query().from(cat).where(cat.name.eq("Bob123")) .select(cat.name.indexOf("B")).fetchFirst()); } @Test @NoOpenJPA public void indexOf2() { assertEquals(Integer.valueOf(1), query().from(cat).where(cat.name.eq("Bob123")) .select(cat.name.indexOf("o")).fetchFirst()); } @Test public void instanceOf_cat() { assertEquals(6L, query().from(cat).where(cat.instanceOf(Cat.class)).fetchCount()); } @Test public void instanceOf_domesticCat() { assertEquals(0L, query().from(cat).where(cat.instanceOf(DomesticCat.class)).fetchCount()); } @Test public void instanceOf_entity1() { QEntity1 entity1 = QEntity1.entity1; assertEquals(2L, query().from(entity1).where(entity1.instanceOf(Entity1.class)).fetchCount()); } @Test public void instanceOf_entity2() { QEntity1 entity1 = QEntity1.entity1; assertEquals(1L, query().from(entity1).where(entity1.instanceOf(Entity2.class)).fetchCount()); } @Test @NoHibernate // https://hibernate.atlassian.net/browse/HHH-6686 public void isEmpty_elementCollection() { QEmployee employee = QEmployee.employee; assertEquals(0, query().from(employee).where(employee.jobFunctions.isEmpty()).fetchCount()); } @Test public void isEmpty_relation() { assertEquals(6L, query().from(cat).where(cat.kittensSet.isEmpty()).fetchCount()); } @Test @NoEclipseLink @ExcludeIn({ORACLE, TERADATA}) public void joinEmbeddable() { QBookVersion bookVersion = QBookVersion.bookVersion; QBookMark bookMark = QBookMark.bookMark; assertEquals(Arrays.asList(), query().from(bookVersion) .join(bookVersion.definition.bookMarks, bookMark) .where( bookVersion.definition.bookMarks.size().eq(1), bookMark.page.eq(2357L).or(bookMark.page.eq(2356L))) .select(bookVersion).fetch()); } @Test public void length() { assertEquals(6, query().from(cat).where(cat.name.length().gt(0)).fetchCount()); } @Test public void like() { assertEquals(0, query().from(cat).where(cat.name.like("!")).fetchCount()); assertEquals(0, query().from(cat).where(cat.name.like("\\")).fetchCount()); } @Test public void limit() { List<String> names1 = Arrays.asList("Allen123","Bob123"); assertEquals(names1, query().from(cat).orderBy(cat.name.asc()).limit(2).select(cat.name).fetch()); } @Test public void limit_and_offset() { List<String> names3 = Arrays.asList("Felix123", "Mary_123"); assertEquals(names3, query().from(cat).orderBy(cat.name.asc()).limit(2).offset(2).select(cat.name).fetch()); } @Test public void limit2() { assertEquals(Collections.singletonList("Allen123"), query().from(cat).orderBy(cat.name.asc()).limit(1).select(cat.name).fetch()); } @Test public void limit3() { assertEquals(6, query().from(cat).limit(Long.MAX_VALUE).select(cat).fetch().size()); } @Test public void list_elementCollection_of_enum() { QEmployee employee = QEmployee.employee; //QJobFunction jobFunction = QJobFunction.jobFunction; EnumPath<JobFunction> jobFunction = Expressions.enumPath(JobFunction.class, "jf"); List<JobFunction> jobFunctions = query().from(employee) .innerJoin(employee.jobFunctions, jobFunction).select(jobFunction).fetch(); assertEquals(4, jobFunctions.size()); } @Test @NoBatooJPA public void list_elementCollection_of_string() { QFoo foo = QFoo.foo; StringPath str = Expressions.stringPath("str"); List<String> strings = query().from(foo).innerJoin(foo.names, str).select(str).fetch(); assertEquals(2, strings.size()); assertTrue(strings.contains("a")); assertTrue(strings.contains("b")); } @Test @NoEclipseLink(HSQLDB) public void list_order_get() { QCat cat = QCat.cat; assertEquals(6, query().from(cat).orderBy(cat.kittens.get(0).name.asc()).fetch().size()); } @Test @NoEclipseLink(HSQLDB) public void list_order_get2() { QCat cat = QCat.cat; assertEquals(6, query().from(cat).orderBy(cat.mate.kittens.get(0).name.asc()).fetch().size()); } @Test public void map_get() { QShow show = QShow.show; assertEquals(Arrays.asList("A"), query().from(show).select(show.acts.get("a")).fetch()); } @Test @NoHibernate public void map_get2() { QShow show = QShow.show; assertEquals(1, query().from(show).where(show.acts.get("a").eq("A")).fetchCount()); } @Test @NoEclipseLink public void map_order_get() { QShow show = QShow.show; assertEquals(1, query().from(show).orderBy(show.parent.acts.get("A").asc()).fetch().size()); } @Test @NoEclipseLink public void map_order_get2() { QShow show = QShow.show; QShow parent = new QShow("parent"); assertEquals(1, query().from(show).leftJoin(show.parent, parent) .orderBy(parent.acts.get("A").asc()).fetch().size()); } @Test public void map_containsKey() { QShow show = QShow.show; assertEquals(1L, query().from(show).where(show.acts.containsKey("a")).fetchCount()); } @Test public void map_containsKey2() { QShow show = QShow.show; assertEquals(1L, query().from(show).where(show.acts.containsKey("b")).fetchCount()); } @Test public void map_containsKey3() { QShow show = QShow.show; assertEquals(0L, query().from(show).where(show.acts.containsKey("c")).fetchCount()); } @Test public void map_containsValue() { QShow show = QShow.show; assertEquals(1L, query().from(show).where(show.acts.containsValue("A")).fetchCount()); } @Test public void map_containsValue2() { QShow show = QShow.show; assertEquals(1L, query().from(show).where(show.acts.containsValue("B")).fetchCount()); } @Test public void map_containsValue3() { QShow show = QShow.show; assertEquals(0L, query().from(show).where(show.acts.containsValue("C")).fetchCount()); } @Test public void map_contains() { QShow show = QShow.show; assertEquals(1L, query().from(show).where(show.acts.contains("a", "A")).fetchCount()); assertEquals(0L, query().from(show).where(show.acts.contains("X", "X")).fetchCount()); } @Test public void map_groupBy() { QShow show = QShow.show; assertEquals(1, query().from(show).select(show.acts.get("X")).groupBy(show.acts.get("a")).fetchCount()); } @Test @Ignore public void map_join() { //select m.text from Show s join s.acts a where key(a) = 'B' QShow show = QShow.show; StringPath act = Expressions.stringPath("act"); assertEquals(Arrays.asList(), query().from(show).join(show.acts, act).select(act).fetch()); } @Test public void max() { assertEquals(6.0, query().from(cat).select(cat.bodyWeight.max()).fetchFirst().doubleValue(), 0.0001); } @Test public void min() { assertEquals(1.0, query().from(cat).select(cat.bodyWeight.min()).fetchFirst().doubleValue(), 0.0001); } @Test @ExcludeIn(ORACLE) public void multiply() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); assertEquals(Arrays.asList(), query().from(entity, entity2) .where(entity.ddouble.multiply(entity2.ddouble).loe(2.0)) .select(entity).fetch()); } @Test @ExcludeIn(ORACLE) public void multiply_bigDecimal() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); NumberPath<BigDecimal> bigd1 = entity.bigDecimal; NumberPath<BigDecimal> bigd2 = entity2.bigDecimal; assertEquals(Arrays.asList(), query().from(entity, entity2) .where(bigd1.multiply(bigd2).loe(new BigDecimal("1.00"))) .select(entity).fetch()); } @Test public void nestedProjection() { Concatenation concat = new Concatenation(cat.name, cat.name); List<Tuple> tuples = query().from(cat).select(cat.name, concat).fetch(); assertFalse(tuples.isEmpty()); for (Tuple tuple : tuples) { assertEquals( tuple.get(concat), tuple.get(cat.name) + tuple.get(cat.name)); } } @Test public void not_in() { long all = query().from(cat).fetchCount(); assertEquals(all - 3L, query().from(cat).where(cat.name.notIn("Bob123", "Ruth123", "Felix123")).fetchCount()); assertEquals(3L, query().from(cat).where(cat.id.notIn(1, 2, 3)).fetchCount()); assertEquals(6L, query().from(cat).where(cat.name.notIn("A", "B", "C")).fetchCount()); } @Test @NoBatooJPA public void not_in_empty() { long count = query().from(cat).fetchCount(); assertEquals(count, query().from(cat).where(cat.name.notIn(Collections.<String>emptyList())).fetchCount()); } @Test public void null_as_uniqueResult() { assertNull(query().from(cat).where(cat.name.eq(UUID.randomUUID().toString())) .select(cat).fetchFirst()); } @Test @NoEclipseLink public void numeric() { QNumeric numeric = QNumeric.numeric; BigDecimal singleResult = query().from(numeric).select(numeric.value).fetchFirst(); assertEquals(26.9, singleResult.doubleValue(), 0.001); } @Test @NoOpenJPA @NoBatooJPA // FIXME public void offset1() { List<String> names2 = Arrays.asList("Bob123", "Felix123", "Mary_123", "Ruth123", "Some"); assertEquals(names2, query().from(cat).orderBy(cat.name.asc()).offset(1).select(cat.name).fetch()); } @Test @NoOpenJPA @NoBatooJPA // FIXME public void offset2() { List<String> names2 = Arrays.asList("Felix123", "Mary_123", "Ruth123", "Some"); assertEquals(names2, query().from(cat).orderBy(cat.name.asc()).offset(2).select(cat.name).fetch()); } @Test public void one_to_one() { QEmployee employee = QEmployee.employee; QUser user = QUser.user; JPQLQuery<?> query = query(); query.from(employee); query.innerJoin(employee.user, user); query.select(employee).fetch(); } @Test public void order() { NumberPath<Double> weight = Expressions.numberPath(Double.class, "weight"); assertEquals(Arrays.asList(1.0, 2.0, 3.0, 4.0, 5.0, 6.0), query().from(cat).orderBy(weight.asc()).select(cat.bodyWeight.as(weight)).fetch()); } @Test public void order_by_count() { NumberPath<Long> count = Expressions.numberPath(Long.class, "c"); query().from(cat) .groupBy(cat.id) .orderBy(count.asc()) .select(cat.id, cat.id.count().as(count)).fetch(); } @Test public void order_stringValue() { int count = (int) query().from(cat).fetchCount(); assertEquals(count, query().from(cat).orderBy(cat.id.stringValue().asc()).select(cat).fetch().size()); } @Test @NoBatooJPA // can't be parsed public void order_stringValue_to_integer() { int count = (int) query().from(cat).fetchCount(); assertEquals(count, query().from(cat).orderBy(cat.id.stringValue().castToNum(Integer.class).asc()).select(cat).fetch().size()); } @Test @NoBatooJPA // can't be parsed public void order_stringValue_toLong() { int count = (int) query().from(cat).fetchCount(); assertEquals(count, query().from(cat).orderBy(cat.id.stringValue().castToNum(Long.class).asc()).select(cat).fetch().size()); } @Test @NoBatooJPA // can't be parsed public void order_stringValue_toBigInteger() { int count = (int) query().from(cat).fetchCount(); assertEquals(count, query().from(cat).orderBy(cat.id.stringValue().castToNum(BigInteger.class).asc()).select(cat).fetch().size()); } @Test @NoBatooJPA @ExcludeIn(SQLSERVER) public void order_nullsFirst() { assertNull(query().from(cat) .orderBy(cat.dateField.asc().nullsFirst()) .select(cat.dateField).fetchFirst()); } @Test @NoBatooJPA @ExcludeIn(SQLSERVER) public void order_nullsLast() { assertNotNull(query().from(cat) .orderBy(cat.dateField.asc().nullsLast()) .select(cat.dateField).fetchFirst()); } @Test public void params() { Param<String> name = new Param<String>(String.class,"name"); assertEquals("Bob123", query().from(cat).where(cat.name.eq(name)).set(name, "Bob123") .select(cat.name).fetchFirst()); } @Test public void params_anon() { Param<String> name = new Param<String>(String.class); assertEquals("Bob123",query().from(cat).where(cat.name.eq(name)).set(name, "Bob123") .select(cat.name).fetchFirst()); } @Test(expected = ParamNotSetException.class) public void params_not_set() { Param<String> name = new Param<String>(String.class,"name"); assertEquals("Bob123", query().from(cat).where(cat.name.eq(name)).select(cat.name).fetchFirst()); } @Test public void precedence() { StringPath str = cat.name; Predicate where = str.like("Bob%").and(str.like("%ob123")) .or(str.like("Ruth%").and(str.like("%uth123"))); assertEquals(2L, query().from(cat).where(where).fetchCount()); } @Test public void precedence2() { StringPath str = cat.name; Predicate where = str.like("Bob%").and(str.like("%ob123") .or(str.like("Ruth%"))).and(str.like("%uth123")); assertEquals(0L, query().from(cat).where(where).fetchCount()); } @Test public void precedence3() { Predicate where = cat.name.eq("Bob123").and(cat.id.eq(1)) .or(cat.name.eq("Ruth123").and(cat.id.eq(2))); assertEquals(2L, query().from(cat).where(where).fetchCount()); } @Test public void factoryExpression_in_groupBy() { Expression<Cat> catBean = Projections.bean(Cat.class, cat.id, cat.name); assertFalse(query().from(cat).groupBy(catBean).select(catBean).fetch().isEmpty()); } @Test @Ignore public void size() { // NOT SUPPORTED query().from(cat).select(cat, cat.kittens.size()).fetch(); } @Test public void startsWith() { assertEquals(1, query().from(cat).where(cat.name.startsWith("R")).fetchCount()); } @Test public void startsWith_ignoreCase() { assertEquals(1, query().from(cat).where(cat.name.startsWithIgnoreCase("r")).fetchCount()); } @Test public void startsWith2() { assertEquals(0, query().from(cat).where(cat.name.startsWith("X")).fetchCount()); } @Test public void startsWith3() { assertEquals(1, query().from(cat).where(cat.name.startsWith("Mary_")).fetchCount()); } @Test @ExcludeIn({MYSQL, SQLSERVER, TERADATA}) @NoOpenJPA public void stringOperations() { // NOTE : locate in MYSQL is case-insensitive assertEquals(0, query().from(cat).where(cat.name.startsWith("r")).fetchCount()); assertEquals(0, query().from(cat).where(cat.name.endsWith("H123")).fetchCount()); assertEquals(Integer.valueOf(2), query().from(cat).where(cat.name.eq("Bob123")) .select(cat.name.indexOf("b")).fetchFirst()); } @Test public void subQuery() { QShow show = QShow.show; QShow show2 = new QShow("show2"); assertEquals(0, query().from(show).where(select(show2.count()).from(show2) .where(show2.id.ne(show.id)).gt(0L)).fetchCount()); } @Test public void subQuery2() { QCat cat = QCat.cat; QCat other = new QCat("other"); assertEquals(savedCats, query().from(cat) .where(cat.name.in(select(other.name).from(other) .groupBy(other.name))) .orderBy(cat.id.asc()) .select(cat).fetch()); } @Test public void subQuery3() { QCat cat = QCat.cat; QCat other = new QCat("other"); assertEquals(savedCats.subList(0, 1), query().from(cat) .where(cat.name.eq(select(other.name).from(other) .where(other.name.indexOf("B").eq(0)))) .select(cat).fetch()); } @Test public void subQuery4() { QCat cat = QCat.cat; QCat other = new QCat("other"); query().from(cat) .select(cat.name, select(other.count()).from(other).where(other.name.eq(cat.name))).fetch(); } @Test public void subQuery5() { QEmployee employee = QEmployee.employee; QEmployee employee2 = new QEmployee("e2"); assertEquals(2, query().from(employee) .where(select(employee2.id.count()).from(employee2).gt(1L)) .fetchCount()); } @Test public void substring() { for (String str : query().from(cat).select(cat.name.substring(1,2)).fetch()) { assertEquals(1, str.length()); } } @Test @NoBatooJPA @ExcludeIn(ORACLE) public void substring2() { QCompany company = QCompany.company; StringExpression name = company.name; Integer companyId = query().from(company).select(company.id).fetchFirst(); JPQLQuery<?> query = query().from(company).where(company.id.eq(companyId)); String str = query.select(company.name).fetchFirst(); assertEquals(Integer.valueOf(29), query.select(name.length().subtract(11)).fetchFirst()); assertEquals(str.substring(0, 7), query.select(name.substring(0, 7)).fetchFirst()); assertEquals(str.substring(15), query.select(name.substring(15)).fetchFirst()); assertEquals(str.substring(str.length()), query.select(name.substring(name.length())).fetchFirst()); assertEquals(str.substring(str.length() - 11), query.select(name.substring(name.length().subtract(11))).fetchFirst()); } @Test @Ignore // FIXME @ExcludeIn(DERBY) public void substring_from_right() { assertEquals(Arrays.asList(), query().from(cat) .where(cat.name.substring(-1, 1).eq(cat.name.substring(-2, 1))) .select(cat).fetch()); } @Test @ExcludeIn({HSQLDB, DERBY}) public void substring_from_right2() { assertEquals(Arrays.asList(), query().from(cat) .where(cat.name.substring(cat.name.length().subtract(1), cat.name.length()) .eq(cat.name.substring(cat.name.length().subtract(2), cat.name.length().subtract(1)))) .select(cat).fetch()); } @Test @ExcludeIn(ORACLE) public void subtract_bigDecimal() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); NumberPath<BigDecimal> bigd1 = entity.bigDecimal; NumberPath<BigDecimal> bigd2 = entity2.bigDecimal; assertEquals(Arrays.asList(), query().from(entity, entity2) .where(bigd1.subtract(bigd2).loe(new BigDecimal("1.00"))) .select(entity).fetch()); } @Test @Ignore public void sum() throws RecognitionException, TokenStreamException { // NOT SUPPORTED query().from(cat).select(cat.kittens.size().sum()).fetch(); } @Test @Ignore public void sum_2() throws RecognitionException, TokenStreamException { // NOT SUPPORTED query().from(cat).where(cat.kittens.size().sum().gt(0)).select(cat).fetch(); } @Test public void sum_3() { assertEquals(21.0, query().from(cat).select(cat.bodyWeight.sum()).fetchFirst().doubleValue(), 0.0001); } @Test public void sum_3_projected() { double val = query().from(cat).select(cat.bodyWeight.sum()).fetchFirst(); DoubleProjection projection = query().from(cat) .select(new QDoubleProjection(cat.bodyWeight.sum())).fetchFirst(); assertEquals(val, projection.val, 0.001); } @Test public void sum_4() { Double dbl = query().from(cat).select(cat.bodyWeight.sum().negate()).fetchFirst(); assertNotNull(dbl); } @Test public void sum_5() { QShow show = QShow.show; Long lng = query().from(show).select(show.id.sum()).fetchFirst(); assertNotNull(lng); } @Test public void sum_of_integer() { QCat cat2 = new QCat("cat2"); assertEquals(Arrays.asList(), query().from(cat) .where(select(cat2.breed.sum()) .from(cat2).where(cat2.eq(cat.mate)).gt(0)) .select(cat).fetch()); } @Test public void sum_of_float() { QCat cat2 = new QCat("cat2"); query().from(cat) .where(select(cat2.floatProperty.sum()) .from(cat2).where(cat2.eq(cat.mate)).gt(0.0f)) .select(cat).fetch(); } @Test public void sum_of_double() { QCat cat2 = new QCat("cat2"); query().from(cat) .where(select(cat2.bodyWeight.sum()) .from(cat2).where(cat2.eq(cat.mate)).gt(0.0)) .select(cat).fetch(); } @Test public void sum_as_float() { float val = query().from(cat).select(cat.floatProperty.sum()).fetchFirst(); assertTrue(val > 0); } @Test public void sum_as_float_projected() { float val = query().from(cat).select(cat.floatProperty.sum()).fetchFirst(); FloatProjection projection = query().from(cat) .select(new QFloatProjection(cat.floatProperty.sum())).fetchFirst(); assertEquals(val, projection.val, 0.001); } @Test public void sum_as_float2() { float val = query().from(cat).select(cat.floatProperty.sum().negate()).fetchFirst(); assertTrue(val < 0); } @Test public void sum_coalesce() { int val = query().from(cat).select(cat.weight.sum().coalesce(0)).fetchFirst(); assertTrue(val == 0); } @Test public void sum_noRows_double() { assertEquals(null, query().from(cat) .where(cat.name.eq(UUID.randomUUID().toString())) .select(cat.bodyWeight.sum()).fetchFirst()); } @Test public void sum_noRows_float() { assertEquals(null, query().from(cat) .where(cat.name.eq(UUID.randomUUID().toString())) .select(cat.floatProperty.sum()).fetchFirst()); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void test() { Cat kitten = savedCats.get(0); Cat noKitten = savedCats.get(savedCats.size() - 1); ProjectionsFactory projections = new ProjectionsFactory(Module.JPA, getTarget()) { @Override public <A,Q extends SimpleExpression<A>> Collection<Expression<?>> list(ListPath<A,Q> expr, ListExpression<A,Q> other, A knownElement) { // NOTE : expr.get(0) is only supported in the where clause return Collections.<Expression<?>>singleton(expr.size()); } }; final EntityPath<?>[] sources = {cat, otherCat}; final Predicate[] conditions = {condition}; final Expression<?>[] projection = {cat.name, otherCat.name}; QueryExecution standardTest = new QueryExecution( projections, new FilterFactory(projections, Module.JPA, getTarget()), new MatchingFiltersFactory(Module.JPA, getTarget())) { @Override protected Fetchable<?> createQuery() { // NOTE : EclipseLink needs extra conditions cond1 and code2 return testQuery().from(sources).where(conditions); } @Override protected Fetchable<?> createQuery(Predicate filter) { // NOTE : EclipseLink needs extra conditions cond1 and code2 return testQuery().from(sources).where(condition, filter).select(projection); } }; // standardTest.runArrayTests(cat.kittensArray, otherCat.kittensArray, kitten, noKitten); standardTest.runBooleanTests(cat.name.isNull(), otherCat.kittens.isEmpty()); standardTest.runCollectionTests(cat.kittens, otherCat.kittens, kitten, noKitten); standardTest.runDateTests(cat.dateField, otherCat.dateField, date); standardTest.runDateTimeTests(cat.birthdate, otherCat.birthdate, birthDate); standardTest.runListTests(cat.kittens, otherCat.kittens, kitten, noKitten); // standardTest.mapTests(cat.kittensByName, otherCat.kittensByName, "Kitty", kitten); // int standardTest.runNumericCasts(cat.id, otherCat.id, 1); standardTest.runNumericTests(cat.id, otherCat.id, 1); // double standardTest.runNumericCasts(cat.bodyWeight, otherCat.bodyWeight, 1.0); standardTest.runNumericTests(cat.bodyWeight, otherCat.bodyWeight, 1.0); standardTest.runStringTests(cat.name, otherCat.name, kitten.getName()); standardTest.runTimeTests(cat.timeField, otherCat.timeField, time); standardTest.report(); } @Test public void tupleProjection() { List<Tuple> tuples = query().from(cat).select(cat.name, cat).fetch(); assertFalse(tuples.isEmpty()); for (Tuple tuple : tuples) { assertNotNull(tuple.get(cat.name)); assertNotNull(tuple.get(cat)); } } @Test public void tupleProjection_as_queryResults() { QueryResults<Tuple> tuples = query().from(cat).limit(1) .select(cat.name, cat).fetchResults(); assertEquals(1, tuples.getResults().size()); assertTrue(tuples.getTotal() > 0); } @Test @ExcludeIn(DERBY) public void transform_groupBy() { QCat kitten = new QCat("kitten"); Map<Integer, Cat> result = query().from(cat).innerJoin(cat.kittens, kitten) .transform(GroupBy.groupBy(cat.id) .as(Projections.constructor(Cat.class, cat.name, cat.id, GroupBy.list(Projections.constructor(Cat.class, kitten.name, kitten.id))))); for (Cat entry : result.values()) { assertEquals(1, entry.getKittens().size()); } } @Test @ExcludeIn(DERBY) public void transform_groupBy2() { QCat kitten = new QCat("kitten"); Map<List<?>, Group> result = query().from(cat).innerJoin(cat.kittens, kitten) .transform(GroupBy.groupBy(cat.id, kitten.id) .as(cat, kitten)); assertFalse(result.isEmpty()); for (Tuple row : query().from(cat).innerJoin(cat.kittens, kitten) .select(cat, kitten).fetch()) { assertNotNull(result.get(Arrays.asList(row.get(cat).getId(), row.get(kitten).getId()))); } } @Test @ExcludeIn(DERBY) public void transform_groupBy_alias() { QCat kitten = new QCat("kitten"); SimplePath<Cat> k = Expressions.path(Cat.class, "k"); Map<Integer, Group> result = query().from(cat).innerJoin(cat.kittens, kitten) .transform(GroupBy.groupBy(cat.id) .as(cat.name, cat.id, GroupBy.list(Projections.constructor(Cat.class, kitten.name, kitten.id).as(k)))); for (Group entry : result.values()) { assertNotNull(entry.getOne(cat.id)); assertNotNull(entry.getOne(cat.name)); assertFalse(entry.getList(k).isEmpty()); } } @Test @NoBatooJPA public void treat() { QDomesticCat domesticCat = QDomesticCat.domesticCat; assertEquals(0, query().from(cat) .innerJoin(cat.mate, domesticCat._super) .where(domesticCat.name.eq("Bobby")) .fetchCount()); } @Test @Ignore public void type() { assertEquals(Arrays.asList("C","C","C","C","C","C","A"), query().from(animal).orderBy(animal.id.asc()).select(JPAExpressions.type(animal)).fetch()); } @Test @NoOpenJPA public void type_order() { assertEquals(Arrays.asList(10, 1, 2, 3, 4, 5, 6), query().from(animal).orderBy(JPAExpressions.type(animal).asc(), animal.id.asc()) .select(animal.id).fetch()); } @Test @ExcludeIn(DERBY) public void byte_array() { QSimpleTypes simpleTypes = QSimpleTypes.simpleTypes; assertEquals(ImmutableList.of(), query().from(simpleTypes) .where(simpleTypes.byteArray.eq(new byte[]{0, 1})).select(simpleTypes).fetch()); } }