/* * 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.JPAExpressions.selectOne; import static org.junit.Assert.assertEquals; import java.util.Arrays; import org.junit.Test; import com.querydsl.core.DefaultQueryMetadata; import com.querydsl.core.JoinType; import com.querydsl.core.QueryMetadata; import com.querydsl.core.domain.QCat; import com.querydsl.core.types.EntityPath; import com.querydsl.core.types.Expression; import com.querydsl.core.types.Path; import com.querydsl.core.types.Predicate; import com.querydsl.core.types.dsl.EntityPathBase; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.NumberPath; import com.querydsl.jpa.domain.JobFunction; import com.querydsl.jpa.domain.Location; import com.querydsl.jpa.domain.QDomesticCat; import com.querydsl.jpa.domain.QEmployee; public class JPQLSerializerTest { @Test public void and_or() { //A.a.id.eq(theId).and(B.b.on.eq(false).or(B.b.id.eq(otherId))); QCat cat = QCat.cat; Predicate pred = cat.id.eq(1).and(cat.name.eq("Kitty").or(cat.name.eq("Boris"))); JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); serializer.handle(pred); assertEquals("cat.id = ?1 and (cat.name = ?2 or cat.name = ?3)", serializer.toString()); assertEquals("cat.id = 1 && (cat.name = Kitty || cat.name = Boris)", pred.toString()); } @Test public void case1() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(JPQLTemplates.DEFAULT); Expression<?> expr = Expressions.cases().when(cat.toes.eq(2)).then(2) .when(cat.toes.eq(3)).then(3) .otherwise(4); serializer.handle(expr); assertEquals("case when (cat.toes = ?1) then ?1 when (cat.toes = ?2) then ?2 else ?3 end", serializer.toString()); } @Test public void case1_hibernate() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); Expression<?> expr = Expressions.cases().when(cat.toes.eq(2)).then(2) .when(cat.toes.eq(3)).then(3) .otherwise(4); serializer.handle(expr); assertEquals("case when (cat.toes = ?1) then ?1 when (cat.toes = ?2) then ?2 else 4 end", serializer.toString()); } @Test public void case2() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(JPQLTemplates.DEFAULT); Expression<?> expr = Expressions.cases().when(cat.toes.eq(2)).then(cat.id.multiply(2)) .when(cat.toes.eq(3)).then(cat.id.multiply(3)) .otherwise(4); serializer.handle(expr); assertEquals("case when (cat.toes = ?1) then (cat.id * ?1) when (cat.toes = ?2) then (cat.id * ?2) else ?3 end", serializer.toString()); } @Test public void case2_hibernate() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); Expression<?> expr = Expressions.cases().when(cat.toes.eq(2)).then(cat.id.multiply(2)) .when(cat.toes.eq(3)).then(cat.id.multiply(3)) .otherwise(4); serializer.handle(expr); assertEquals("case when (cat.toes = ?1) then (cat.id * ?1) when (cat.toes = ?2) then (cat.id * ?2) else 4 end", serializer.toString()); } @Test public void count() { QCat cat = QCat.cat; QueryMetadata md = new DefaultQueryMetadata(); md.addJoin(JoinType.DEFAULT, cat); md.setProjection(cat.mate.countDistinct()); JPQLSerializer serializer1 = new JPQLSerializer(HQLTemplates.DEFAULT); serializer1.serialize(md, true, null); assertEquals("select count(count(distinct cat.mate))\n" + "from Cat cat", serializer1.toString()); JPQLSerializer serializer2 = new JPQLSerializer(HQLTemplates.DEFAULT); serializer2.serialize(md, false, null); assertEquals("select count(distinct cat.mate)\n" + "from Cat cat", serializer2.toString()); } @Test public void fromWithCustomEntityName() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); EntityPath<Location> entityPath = new EntityPathBase<Location>(Location.class, "entity"); QueryMetadata md = new DefaultQueryMetadata(); md.addJoin(JoinType.DEFAULT, entityPath); serializer.serialize(md, false, null); assertEquals("select entity\nfrom Location2 entity", serializer.toString()); } @Test public void join_with() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); QueryMetadata md = new DefaultQueryMetadata(); md.addJoin(JoinType.DEFAULT, cat); md.addJoin(JoinType.INNERJOIN, cat.mate); md.addJoinCondition(cat.mate.alive); serializer.serialize(md, false, null); assertEquals("select cat\nfrom Cat cat\n inner join cat.mate with cat.mate.alive", serializer.toString()); } @Test public void normalizeNumericArgs() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); NumberPath<Double> doublePath = Expressions.numberPath(Double.class, "doublePath"); serializer.handle(doublePath.add(1)); serializer.handle(doublePath.between((float) 1.0, 1L)); serializer.handle(doublePath.lt((byte) 1)); for (Object constant : serializer.getConstantToLabel().keySet()) { assertEquals(Double.class, constant.getClass()); } } @Test public void delete_clause_uses_dELETE_fROM() { QEmployee employee = QEmployee.employee; JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); QueryMetadata md = new DefaultQueryMetadata(); md.addJoin(JoinType.DEFAULT, employee); md.addWhere(employee.lastName.isNull()); serializer.serializeForDelete(md); assertEquals("delete from Employee employee\nwhere employee.lastName is null", serializer.toString()); } @Test public void delete_with_subQuery() { QCat parent = QCat.cat; QCat child = new QCat("kitten"); JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); QueryMetadata md = new DefaultQueryMetadata(); md.addJoin(JoinType.DEFAULT, child); md.addWhere( child.id.eq(1) .and(selectOne() .from(parent) .where(parent.id.eq(2), child.in(parent.kittens)).exists())); serializer.serializeForDelete(md); assertEquals("delete from Cat kitten\n" + "where kitten.id = ?1 and exists (select 1\n" + "from Cat cat\nwhere cat.id = ?2 and kitten member of cat.kittens)", serializer.toString()); } @Test public void in() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); serializer.handle(Expressions.numberPath(Integer.class, "id").in(Arrays.asList(1, 2))); assertEquals("id in (?1)", serializer.toString()); } @Test public void not_in() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); serializer.handle(Expressions.numberPath(Integer.class, "id").notIn(Arrays.asList(1, 2))); assertEquals("id not in (?1)", serializer.toString()); } @Test public void like() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); serializer.handle(Expressions.stringPath("str").contains("abc!")); assertEquals("str like ?1 escape '!'", serializer.toString()); assertEquals("%abc!!%", serializer.getConstantToLabel().keySet().iterator().next().toString()); } @Test public void stringContainsIc() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); serializer.handle(Expressions.stringPath("str").containsIgnoreCase("ABc!")); assertEquals("lower(str) like ?1 escape '!'", serializer.toString()); assertEquals("%abc!!%", serializer.getConstantToLabel().keySet().iterator().next().toString()); } @Test public void substring() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); QCat cat = QCat.cat; serializer.handle(cat.name.substring(cat.name.length().subtract(1), 1)); assertEquals("substring(cat.name,length(cat.name) + ?1,?2 - (length(cat.name) - ?2))", serializer.toString()); } @Test public void nullsFirst() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); QueryMetadata md = new DefaultQueryMetadata(); md.addJoin(JoinType.DEFAULT, cat); md.addOrderBy(cat.name.asc().nullsFirst()); serializer.serialize(md, false, null); assertEquals("select cat\n" + "from Cat cat\n" + "order by cat.name asc nulls first", serializer.toString()); } @Test public void nullsLast() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); QueryMetadata md = new DefaultQueryMetadata(); md.addJoin(JoinType.DEFAULT, cat); md.addOrderBy(cat.name.asc().nullsLast()); serializer.serialize(md, false, null); assertEquals("select cat\n" + "from Cat cat\n" + "order by cat.name asc nulls last", serializer.toString()); } @SuppressWarnings("unchecked") @Test public void treat() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); QueryMetadata md = new DefaultQueryMetadata(); md.addJoin(JoinType.DEFAULT, cat); md.addJoin(JoinType.JOIN, cat.mate.as((Path) QDomesticCat.domesticCat)); md.setProjection(QDomesticCat.domesticCat); serializer.serialize(md, false, null); assertEquals("select domesticCat\n" + "from Cat cat\n" + " inner join treat(cat.mate as DomesticCat) as domesticCat", serializer.toString()); } @Test public void openJPA_variables() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(OpenJPATemplates.DEFAULT); QueryMetadata md = new DefaultQueryMetadata(); md.addJoin(JoinType.DEFAULT, cat); md.addJoin(JoinType.INNERJOIN, cat.mate); md.addJoinCondition(cat.mate.alive); serializer.serialize(md, false, null); assertEquals("select cat_\nfrom Cat cat_\n inner join cat_.mate on cat_.mate.alive", serializer.toString()); } @Test public void visitLiteral_boolean() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); serializer.visitLiteral(Boolean.TRUE); assertEquals("true", serializer.toString()); } @Test public void visitLiteral_number() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); serializer.visitLiteral(1.543); assertEquals("1.543", serializer.toString()); } @Test public void visitLiteral_string() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); serializer.visitLiteral("abc''def"); assertEquals("'abc''''def'", serializer.toString()); } @Test public void visitLiteral_enum() { JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); serializer.visitLiteral(JobFunction.MANAGER); assertEquals("com.querydsl.jpa.domain.JobFunction.MANAGER", serializer.toString()); } @Test public void substring_indexOf() { QCat cat = QCat.cat; JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT); cat.name.substring(cat.name.indexOf("")).accept(serializer, null); assertEquals("substring(cat.name,locate(?1,cat.name)-1 + ?2)", serializer.toString()); } }