Skip to content

Commit 392adcd

Browse files
chadongmin차동민/BE/GNvelo
authored
Fix Enum Serialization in CaseBuilder for Hibernate Compatibility (#966)
* Fix enum serialization in CaseBuilder for Hibernate compatibility * Add test code * Updated visitOperation to include Ops.CASE_WHEN in inCaseOperation check * Simplify enum serialization in CASE WHEN by adding Ops.CASE_WHEN to CASE_OPS --------- Co-authored-by: 차동민/BE/GN <[email protected]> Co-authored-by: Marvin <[email protected]>
1 parent f00bd51 commit 392adcd

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public class JPQLSerializer extends SerializerBase<JPQLSerializer> {
6565
Ops.ADD, Ops.SUB, Ops.MULT, Ops.DIV, Ops.LT, Ops.LOE, Ops.GT, Ops.GOE, Ops.BETWEEN));
6666

6767
private static final Set<? extends Operator> CASE_OPS =
68-
Collections.unmodifiableSet(EnumSet.of(Ops.CASE_ELSE));
68+
Collections.unmodifiableSet(EnumSet.of(Ops.CASE_WHEN, Ops.CASE_ELSE));
6969

7070
private static final String COMMA = ", ";
7171

@@ -383,6 +383,10 @@ private void serializeSources(boolean forCountRow, List<JoinExpression> joins) {
383383

384384
@Override
385385
public void visitConstant(Object constant) {
386+
if (inCaseOperation && constant instanceof Enum) {
387+
visitLiteral(constant);
388+
return;
389+
}
386390
if (inCaseOperation && templates.isCaseWithLiterals()) {
387391
if (constant instanceof Collection) {
388392
append("(");

querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLTemplates.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ public String asLiteral(Object constant) {
213213
} else if (constant instanceof String) {
214214
return "'" + escapeLiteral(constant.toString()) + "'";
215215
} else if (constant instanceof Enum) {
216-
return constant.getClass().getName() + "." + ((Enum) constant).name();
216+
return "'" + ((Enum<?>) constant).name() + "'";
217217
} else {
218218
return "'" + constant.toString() + "'";
219219
}

querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/JPQLSerializerTest.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,13 @@
1919
import com.querydsl.core.DefaultQueryMetadata;
2020
import com.querydsl.core.JoinType;
2121
import com.querydsl.core.QueryMetadata;
22-
import com.querydsl.core.domain.QAnimal;
2322
import com.querydsl.core.domain.QCat;
2423
import com.querydsl.core.types.EntityPath;
2524
import com.querydsl.core.types.Expression;
2625
import com.querydsl.core.types.Path;
2726
import com.querydsl.core.types.Predicate;
28-
import com.querydsl.core.types.dsl.EntityPathBase;
29-
import com.querydsl.core.types.dsl.Expressions;
30-
import com.querydsl.core.types.dsl.NumberPath;
31-
import com.querydsl.jpa.domain.JobFunction;
32-
import com.querydsl.jpa.domain.Location;
33-
import com.querydsl.jpa.domain.QDomesticCat;
34-
import com.querydsl.jpa.domain.QEmployee;
27+
import com.querydsl.core.types.dsl.*;
28+
import com.querydsl.jpa.domain.*;
3529
import java.util.Arrays;
3630
import org.junit.Test;
3731

@@ -67,7 +61,7 @@ public void case1_hibernate() {
6761
Expressions.cases().when(cat.toes.eq(2)).then(2).when(cat.toes.eq(3)).then(3).otherwise(4);
6862
serializer.handle(expr);
6963
assertThat(serializer.toString())
70-
.isEqualTo("case when (cat.toes = ?1) then ?2 when (cat.toes = ?3) then ?4 else 4 end");
64+
.isEqualTo("case when (cat.toes = ?1) then 2 when (cat.toes = ?2) then 3 else 4 end");
7165
}
7266

7367
@Test
@@ -337,18 +331,38 @@ public void visitLiteral_string() {
337331
assertThat(serializer).hasToString("'abc''''def'");
338332
}
339333

340-
@Test
341-
public void visitLiteral_enum() {
342-
var serializer = new JPQLSerializer(HQLTemplates.DEFAULT);
343-
serializer.visitLiteral(JobFunction.MANAGER);
344-
assertThat(serializer).hasToString("com.querydsl.jpa.domain.JobFunction.MANAGER");
345-
}
346-
347334
@Test
348335
public void substring_indexOf() {
349336
var cat = QCat.cat;
350337
var serializer = new JPQLSerializer(HQLTemplates.DEFAULT);
351338
cat.name.substring(cat.name.indexOf("")).accept(serializer, null);
352339
assertThat(serializer).hasToString("substring(cat.name,locate(?1,cat.name)-1 + ?2)");
353340
}
341+
342+
@Test
343+
public void case_enumConversion() {
344+
var serializer = new JPQLSerializer(JPQLTemplates.DEFAULT);
345+
346+
Expression<?> expr =
347+
new CaseBuilder()
348+
.when(Expressions.TRUE)
349+
.then(JobFunction.MANAGER)
350+
.otherwise(JobFunction.CONSULTANT);
351+
352+
serializer.handle(expr);
353+
354+
assertThat(serializer.toString())
355+
.isEqualTo("case when true then 'MANAGER' else 'CONSULTANT' end");
356+
}
357+
358+
@Test
359+
public void inClause_enumCollection() {
360+
QAnimal animal = QAnimal.animal;
361+
Expression<?> predicate = animal.color.in(Arrays.asList(Color.BLACK, Color.TABBY));
362+
JPQLSerializer serializer = new JPQLSerializer(JPQLTemplates.DEFAULT);
363+
serializer.handle(predicate);
364+
assertThat(serializer.toString()).isEqualTo("animal.color in ?1");
365+
Object constant = serializer.getConstants().get(0);
366+
assertThat(constant.toString()).isEqualTo("[BLACK, TABBY]");
367+
}
354368
}

0 commit comments

Comments
 (0)