diff --git a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java index d780470bdd..10779004c4 100644 --- a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java +++ b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java @@ -65,7 +65,7 @@ public class JPQLSerializer extends SerializerBase { Ops.ADD, Ops.SUB, Ops.MULT, Ops.DIV, Ops.LT, Ops.LOE, Ops.GT, Ops.GOE, Ops.BETWEEN)); private static final Set CASE_OPS = - Collections.unmodifiableSet(EnumSet.of(Ops.CASE_ELSE)); + Collections.unmodifiableSet(EnumSet.of(Ops.CASE_WHEN, Ops.CASE_ELSE)); private static final String COMMA = ", "; @@ -383,6 +383,10 @@ private void serializeSources(boolean forCountRow, List joins) { @Override public void visitConstant(Object constant) { + if (inCaseOperation && constant instanceof Enum) { + visitLiteral(constant); + return; + } if (inCaseOperation && templates.isCaseWithLiterals()) { if (constant instanceof Collection) { append("("); diff --git a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLTemplates.java b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLTemplates.java index 8f0d3e73b9..acee3973b5 100644 --- a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLTemplates.java +++ b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLTemplates.java @@ -213,7 +213,7 @@ public String asLiteral(Object constant) { } else if (constant instanceof String) { return "'" + escapeLiteral(constant.toString()) + "'"; } else if (constant instanceof Enum) { - return constant.getClass().getName() + "." + ((Enum) constant).name(); + return "'" + ((Enum) constant).name() + "'"; } else { return "'" + constant.toString() + "'"; } diff --git a/querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/JPQLSerializerTest.java b/querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/JPQLSerializerTest.java index 3040899b07..06eeb5c91f 100644 --- a/querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/JPQLSerializerTest.java +++ b/querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/JPQLSerializerTest.java @@ -19,19 +19,13 @@ import com.querydsl.core.DefaultQueryMetadata; import com.querydsl.core.JoinType; import com.querydsl.core.QueryMetadata; -import com.querydsl.core.domain.QAnimal; 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; +import com.querydsl.core.types.dsl.*; +import com.querydsl.jpa.domain.*; import java.util.Arrays; import org.junit.Test; @@ -67,7 +61,7 @@ public void case1_hibernate() { Expressions.cases().when(cat.toes.eq(2)).then(2).when(cat.toes.eq(3)).then(3).otherwise(4); serializer.handle(expr); assertThat(serializer.toString()) - .isEqualTo("case when (cat.toes = ?1) then ?2 when (cat.toes = ?3) then ?4 else 4 end"); + .isEqualTo("case when (cat.toes = ?1) then 2 when (cat.toes = ?2) then 3 else 4 end"); } @Test @@ -337,13 +331,6 @@ public void visitLiteral_string() { assertThat(serializer).hasToString("'abc''''def'"); } - @Test - public void visitLiteral_enum() { - var serializer = new JPQLSerializer(HQLTemplates.DEFAULT); - serializer.visitLiteral(JobFunction.MANAGER); - assertThat(serializer).hasToString("com.querydsl.jpa.domain.JobFunction.MANAGER"); - } - @Test public void substring_indexOf() { var cat = QCat.cat; @@ -351,4 +338,31 @@ public void substring_indexOf() { cat.name.substring(cat.name.indexOf("")).accept(serializer, null); assertThat(serializer).hasToString("substring(cat.name,locate(?1,cat.name)-1 + ?2)"); } + + @Test + public void case_enumConversion() { + var serializer = new JPQLSerializer(JPQLTemplates.DEFAULT); + + Expression expr = + new CaseBuilder() + .when(Expressions.TRUE) + .then(JobFunction.MANAGER) + .otherwise(JobFunction.CONSULTANT); + + serializer.handle(expr); + + assertThat(serializer.toString()) + .isEqualTo("case when true then 'MANAGER' else 'CONSULTANT' end"); + } + + @Test + public void inClause_enumCollection() { + QAnimal animal = QAnimal.animal; + Expression predicate = animal.color.in(Arrays.asList(Color.BLACK, Color.TABBY)); + JPQLSerializer serializer = new JPQLSerializer(JPQLTemplates.DEFAULT); + serializer.handle(predicate); + assertThat(serializer.toString()).isEqualTo("animal.color in ?1"); + Object constant = serializer.getConstants().get(0); + assertThat(constant.toString()).isEqualTo("[BLACK, TABBY]"); + } }