mirror of
https://github.com/querydsl/querydsl.git
synced 2026-06-19 21:00:53 +08:00
Merge pull request #1208 from querydsl/i1205
Move literal serialization to JPQLTemplates
This commit is contained in:
commit
178eb42767
@ -329,40 +329,7 @@ public class JPQLSerializer extends SerializerBase<JPQLSerializer> {
|
||||
}
|
||||
|
||||
public void visitLiteral(Object constant) {
|
||||
if (constant instanceof Boolean) {
|
||||
append(constant.toString());
|
||||
} else if (constant instanceof Number) {
|
||||
append(constant.toString());
|
||||
} else if (constant instanceof String) {
|
||||
append("'");
|
||||
append(escapeLiteral(constant.toString()));
|
||||
append("'");
|
||||
} else if (constant instanceof Enum<?>) {
|
||||
append(constant.getClass().getName());
|
||||
append(".");
|
||||
append(((Enum<?>) constant).name());
|
||||
} else {
|
||||
// TODO date time literals
|
||||
throw new IllegalArgumentException("Unsupported constant " + constant);
|
||||
}
|
||||
}
|
||||
|
||||
private String escapeLiteral(String str) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (char ch : str.toCharArray()) {
|
||||
if (ch == '\n') {
|
||||
builder.append("\\n");
|
||||
continue;
|
||||
} else if (ch == '\r') {
|
||||
builder.append("\\r");
|
||||
continue;
|
||||
} else if (ch == '\'') {
|
||||
builder.append("''");
|
||||
continue;
|
||||
}
|
||||
builder.append(ch);
|
||||
}
|
||||
return builder.toString();
|
||||
append(templates.asLiteral(constant));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -190,4 +190,35 @@ public class JPQLTemplates extends Templates {
|
||||
return false;
|
||||
}
|
||||
|
||||
public String asLiteral(Object constant) {
|
||||
if (constant instanceof Boolean) {
|
||||
return constant.toString();
|
||||
} else if (constant instanceof Number) {
|
||||
return constant.toString();
|
||||
} else if (constant instanceof String) {
|
||||
return "'" + escapeLiteral(constant.toString()) + "'";
|
||||
} else if (constant instanceof Enum) {
|
||||
return constant.getClass().getName() + "." + ((Enum) constant).name();
|
||||
} else {
|
||||
return "'" + constant.toString() + "'";
|
||||
}
|
||||
}
|
||||
|
||||
private String escapeLiteral(String str) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (char ch : str.toCharArray()) {
|
||||
if (ch == '\n') {
|
||||
builder.append("\\n");
|
||||
continue;
|
||||
} else if (ch == '\r') {
|
||||
builder.append("\\r");
|
||||
continue;
|
||||
} else if (ch == '\'') {
|
||||
builder.append("''");
|
||||
continue;
|
||||
}
|
||||
builder.append(ch);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,6 +23,9 @@ import java.util.*;
|
||||
import java.util.Calendar;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
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;
|
||||
@ -311,6 +314,62 @@ public abstract class AbstractJPATest {
|
||||
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 Case_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 Case_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 Case_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 Case_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 Case_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 Case_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
|
||||
@ -350,6 +409,12 @@ public abstract class AbstractJPATest {
|
||||
.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");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user