From 64c0510c11df84fc8b1064d42e831fa09f9ef58f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Sun, 7 Sep 2014 21:59:31 +0300 Subject: [PATCH 1/2] Add suport Table/Column annotations in JPA native queries --- .../mysema/query/jpa/NativeSQLSerializer.java | 43 +++++++++++++++++-- .../com/mysema/query/AbstractSQLTest.java | 19 ++++---- .../com/mysema/query/jpa/domain/Company.java | 12 ++---- .../src/test/resources/log4j.properties | 2 +- .../com/mysema/query/sql/SQLSerializer.java | 8 ++-- 5 files changed, 59 insertions(+), 25 deletions(-) diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/NativeSQLSerializer.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/NativeSQLSerializer.java index 76611e4df..756802c62 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/NativeSQLSerializer.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/NativeSQLSerializer.java @@ -13,15 +13,18 @@ */ package com.mysema.query.jpa; +import javax.persistence.Table; +import javax.persistence.Column; +import java.util.*; + import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.mysema.query.JoinExpression; import com.mysema.query.QueryMetadata; import com.mysema.query.sql.*; import com.mysema.query.types.*; -import java.util.*; - /** * NativeSQLSerializer extends the SQLSerializer class to extract referenced entity paths and change * some serialization formats @@ -44,6 +47,33 @@ public final class NativeSQLSerializer extends SQLSerializer { this.wrapEntityProjections = wrapEntityProjections; } + @Override + protected void appendAsColumnName(Path path) { + if (path.getAnnotatedElement().isAnnotationPresent(Column.class)) { + SQLTemplates templates = getTemplates(); + Column column = path.getAnnotatedElement().getAnnotation(Column.class); + append(templates.quoteIdentifier(column.name())); + } else { + super.appendAsColumnName(path); + } + } + + @Override + protected void handleJoinTarget(JoinExpression je) { + SQLTemplates templates = getTemplates(); + Class type = je.getTarget().getType(); + if (type.getAnnotation(Table.class) != null && templates.isSupportsAlias()) { + Table table = type.getAnnotation(Table.class); + if (!table.schema().isEmpty() && templates.isPrintSchema()) { + appendSchemaName(table.schema()); + append("."); + } + appendTableName(table.name()); + append(templates.getTableAlias()); + } + super.handleJoinTarget(je); + } + private boolean isAlias(Expression expr) { return expr instanceof Operation && ((Operation)expr).getOperator() == Ops.ALIAS; } @@ -77,6 +107,8 @@ public final class NativeSQLSerializer extends SQLSerializer { aliases.put(args[i], alias); args[i] = ExpressionUtils.as(args[i], alias); modified = true; + } else if (path.getAnnotatedElement().isAnnotationPresent(Column.class)) { + aliases.put(path, path.getAnnotatedElement().getAnnotation(Column.class).name()); } else { aliases.put(path, ColumnMetadata.getName(path)); } @@ -86,7 +118,12 @@ public final class NativeSQLSerializer extends SQLSerializer { for (int j = 0; j < fargs.size(); j++) { if (fargs.get(j) instanceof Path) { Path path = (Path) fargs.get(j); - String columnName = ColumnMetadata.getName(path); + String columnName; + if (path.getAnnotatedElement().isAnnotationPresent(Column.class)) { + columnName = path.getAnnotatedElement().getAnnotation(Column.class).name(); + } else { + columnName = ColumnMetadata.getName(path); + } if (!used.add(columnName)) { String alias = "col__"+(i+1)+"_"+(j+1); aliases.put(path, alias); diff --git a/querydsl-jpa/src/test/java/com/mysema/query/AbstractSQLTest.java b/querydsl-jpa/src/test/java/com/mysema/query/AbstractSQLTest.java index d10181690..e723a4ea6 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractSQLTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractSQLTest.java @@ -1,23 +1,15 @@ package com.mysema.query; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - import java.sql.SQLException; import java.util.Arrays; import java.util.List; import java.util.UUID; -import org.junit.Ignore; -import org.junit.Test; - import com.mysema.query.jpa.AbstractSQLQuery; import com.mysema.query.jpa.domain.Cat; import com.mysema.query.jpa.domain.Color; import com.mysema.query.jpa.domain.QCat; +import com.mysema.query.jpa.domain.QCompany; import com.mysema.query.jpa.domain.sql.SAnimal; import com.mysema.query.sql.SQLSubQuery; import com.mysema.query.types.ConstructorExpression; @@ -27,6 +19,9 @@ import com.mysema.query.types.SubQueryExpression; import com.mysema.query.types.expr.DateExpression; import com.mysema.query.types.expr.Wildcard; import com.mysema.testutil.ExcludeIn; +import org.junit.Ignore; +import org.junit.Test; +import static org.junit.Assert.*; public abstract class AbstractSQLTest { @@ -159,6 +154,12 @@ public abstract class AbstractSQLTest { } } + @Test + public void EntityQueries7() { + QCompany company = QCompany.company; + query().from(company).list(company.officialName); + } + @Test public void In() { assertEquals(6l, query().from(cat).where(cat.dtype.in("C", "CX")).count()); diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/Company.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/Company.java index 1a510d379..621fe8982 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/Company.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/Company.java @@ -13,16 +13,9 @@ */ package com.mysema.query.jpa.domain; +import javax.persistence.*; import java.util.List; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; - import org.batoo.jpa.annotations.Index; /** @@ -51,4 +44,7 @@ public class Company { public int id; public String name; + + @Column(name="official_name") + public String officialName; } diff --git a/querydsl-jpa/src/test/resources/log4j.properties b/querydsl-jpa/src/test/resources/log4j.properties index 945b555e6..e11c5d6ad 100644 --- a/querydsl-jpa/src/test/resources/log4j.properties +++ b/querydsl-jpa/src/test/resources/log4j.properties @@ -12,5 +12,5 @@ log4j.appender.querydsl=org.apache.log4j.ConsoleAppender log4j.appender.querydsl.layout=org.apache.log4j.PatternLayout log4j.appender.querydsl.layout.ConversionPattern=Querydsl : %C#%M - %m%n -#log4j.logger.com.mysema.query.jpa.hibernate=DEBUG, querydsl +log4j.logger.com.mysema.query.jpa.hibernate=DEBUG, querydsl #log4j.logger.com.mysema.query.jpa.impl=DEBUG, querydsl \ No newline at end of file diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java index b51888e38..16cf6d034 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java @@ -79,7 +79,7 @@ public class SQLSerializer extends SerializerBase { this.dml = dml; } - private void appendAsColumnName(Path path) { + protected void appendAsColumnName(Path path) { String column = ColumnMetadata.getName(path); if (path.getMetadata().getParent() instanceof RelationalPath) { RelationalPath parent = (RelationalPath)path.getMetadata().getParent(); @@ -92,11 +92,11 @@ public class SQLSerializer extends SerializerBase { return configuration.getOverride(path.getSchemaAndTable()); } - private void appendSchemaName(String schema) { + protected void appendSchemaName(String schema) { append(templates.quoteIdentifier(schema)); } - private void appendTableName(String table) { + protected void appendTableName(String table) { append(templates.quoteIdentifier(table)); } @@ -162,7 +162,7 @@ public class SQLSerializer extends SerializerBase { handleTemplate(TemplateFactory.DEFAULT.create(template), Arrays.asList(args)); } - private void handleJoinTarget(JoinExpression je) { + protected void handleJoinTarget(JoinExpression je) { // type specifier if (je.getTarget() instanceof RelationalPath && templates.isSupportsAlias()) { final RelationalPath pe = (RelationalPath) je.getTarget(); From 6b3fbb510bc3632c480efe4d38cc39b4d5700bcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Sun, 7 Sep 2014 22:23:42 +0300 Subject: [PATCH 2/2] Revert logging changes --- querydsl-jpa/src/test/resources/log4j.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/querydsl-jpa/src/test/resources/log4j.properties b/querydsl-jpa/src/test/resources/log4j.properties index e11c5d6ad..945b555e6 100644 --- a/querydsl-jpa/src/test/resources/log4j.properties +++ b/querydsl-jpa/src/test/resources/log4j.properties @@ -12,5 +12,5 @@ log4j.appender.querydsl=org.apache.log4j.ConsoleAppender log4j.appender.querydsl.layout=org.apache.log4j.PatternLayout log4j.appender.querydsl.layout.ConversionPattern=Querydsl : %C#%M - %m%n -log4j.logger.com.mysema.query.jpa.hibernate=DEBUG, querydsl +#log4j.logger.com.mysema.query.jpa.hibernate=DEBUG, querydsl #log4j.logger.com.mysema.query.jpa.impl=DEBUG, querydsl \ No newline at end of file