diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/Configuration.java b/querydsl-apt/src/main/java/com/mysema/query/apt/Configuration.java index 743b26af1..a8b267d6f 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/Configuration.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/Configuration.java @@ -15,6 +15,7 @@ import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import com.mysema.commons.lang.Assert; +import com.mysema.query.annotations.QueryProjection; /** * @author tiwe @@ -24,7 +25,7 @@ public class Configuration { private String namePrefix = "Q"; - protected final Class entityAnn, superTypeAnn, embeddableAnn, dtoAnn, skipAnn; + protected final Class entityAnn, superTypeAnn, embeddableAnn, skipAnn; private boolean useFields = true, useGetters = true; @@ -32,12 +33,12 @@ public class Configuration { Class entityAnn, Class superTypeAnn, Class embeddableAnn, - Class dtoAnn, +// Class dtoAnn, Class skipAnn) { this.entityAnn = Assert.notNull(entityAnn); this.superTypeAnn = superTypeAnn; this.embeddableAnn = embeddableAnn; - this.dtoAnn = dtoAnn; +// this.dtoAnn = dtoAnn; this.skipAnn = skipAnn; } @@ -47,6 +48,7 @@ public class Configuration { public boolean isValidConstructor(ExecutableElement constructor) { return constructor.getModifiers().contains(Modifier.PUBLIC) + && constructor.getAnnotation(QueryProjection.class) != null && !constructor.getParameters().isEmpty(); } @@ -75,9 +77,9 @@ public class Configuration { return embeddableAnn; } - public Class getDtoAnn() { - return dtoAnn; - } +// public Class getDtoAnn() { +// return dtoAnn; +// } public Class getSkipAnn() { return skipAnn; diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java index ab773bdfd..4ea0aba56 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java @@ -9,8 +9,10 @@ import java.io.Writer; import java.lang.annotation.Annotation; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Stack; import javax.annotation.processing.Messager; @@ -23,6 +25,7 @@ import javax.tools.Diagnostic.Kind; import net.jcip.annotations.Immutable; import com.mysema.commons.lang.Assert; +import com.mysema.query.annotations.QueryProjection; import com.mysema.query.codegen.BeanModel; import com.mysema.query.codegen.BeanModelFactory; import com.mysema.query.codegen.Serializer; @@ -129,18 +132,23 @@ public class Processor { // DTOS (optional) - if (conf.getDtoAnn() != null){ - DTOElementVisitor dtoVisitor = new DTOElementVisitor(env, conf, typeFactory); - Map dtos = new HashMap(); - for (Element element : roundEnv.getElementsAnnotatedWith(conf.getDtoAnn())) { - BeanModel model = element.accept(dtoVisitor, null); - dtos.put(model.getName(), model); - } - // serialize entity types - if (!dtos.isEmpty()) { - serialize(Serializers.DTO, dtos); - } - } + DTOElementVisitor dtoVisitor = new DTOElementVisitor(env, conf, typeFactory); + Map dtos = new HashMap(); + Set visited = new HashSet(); + for (Element element : roundEnv.getElementsAnnotatedWith(QueryProjection.class)) { + Element parent = element.getEnclosingElement(); + if (parent.getAnnotation(conf.getEntityAnn()) == null + && parent.getAnnotation(conf.getEmbeddableAnn()) == null + && !visited.contains(parent)){ + BeanModel model = parent.accept(dtoVisitor, null); + dtos.put(model.getName(), model); + visited.add(parent); + } + } + // serialize entity types + if (!dtos.isEmpty()) { + serialize(Serializers.DTO, dtos); + } } diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/QuerydslAnnotationProcessor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/QuerydslAnnotationProcessor.java index db8adc8c3..ce8dc7981 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/QuerydslAnnotationProcessor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/QuerydslAnnotationProcessor.java @@ -31,7 +31,7 @@ import com.mysema.query.annotations.QueryTransient; @SupportedSourceVersion(SourceVersion.RELEASE_6) public class QuerydslAnnotationProcessor extends AbstractProcessor{ - private Class entity, superType, embeddable, dto, skip; + private Class entity, superType, embeddable, skip; @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { @@ -39,10 +39,10 @@ public class QuerydslAnnotationProcessor extends AbstractProcessor{ entity = QueryEntity.class; superType = QuerySupertype.class; embeddable = QueryEmbeddable.class; - dto = QueryProjection.class; +// dto = QueryProjection.class; skip = QueryTransient.class; - Configuration configuration = new Configuration(entity, superType, embeddable, dto, skip); + Configuration configuration = new Configuration(entity, superType, embeddable, skip); Processor processor = new Processor(processingEnv, configuration); processor.process(roundEnv); return true; diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/hibernate/HibernateAnnotationProcessor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/hibernate/HibernateAnnotationProcessor.java index bef4a7d15..1d71c543e 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/hibernate/HibernateAnnotationProcessor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/hibernate/HibernateAnnotationProcessor.java @@ -17,7 +17,7 @@ public class HibernateAnnotationProcessor extends JPAAnnotationProcessor{ @Override protected Configuration createConfiguration() throws ClassNotFoundException { - return new HibernateConfiguration(entity, superType, embeddable, dto, skip); + return new HibernateConfiguration(entity, superType, embeddable, skip); } } diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/hibernate/HibernateConfiguration.java b/querydsl-apt/src/main/java/com/mysema/query/apt/hibernate/HibernateConfiguration.java index 7e5d9e6ea..f0a119b79 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/hibernate/HibernateConfiguration.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/hibernate/HibernateConfiguration.java @@ -15,9 +15,8 @@ public class HibernateConfiguration extends JPAConfiguration{ public HibernateConfiguration(Class entityAnn, Class superTypeAnn, Class embeddableAnn, - Class dtoAnn, Class skipAnn) throws ClassNotFoundException { - super(entityAnn, superTypeAnn, embeddableAnn, dtoAnn, skipAnn); + super(entityAnn, superTypeAnn, embeddableAnn, skipAnn); } @SuppressWarnings("unchecked") diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java index 5ab00175f..9cf050446 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java @@ -16,7 +16,6 @@ import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; -import com.mysema.query.annotations.QueryProjection; import com.mysema.query.apt.Configuration; import com.mysema.query.apt.Processor; @@ -28,7 +27,7 @@ import com.mysema.query.apt.Processor; @SupportedSourceVersion(SourceVersion.RELEASE_6) public class JDOAnnotationProcessor extends AbstractProcessor{ - private Class entity, superType, embeddable, dto, skip; + private Class entity, superType, embeddable, skip; @SuppressWarnings("unchecked") @Override @@ -38,10 +37,9 @@ public class JDOAnnotationProcessor extends AbstractProcessor{ entity = (Class)Class.forName("javax.jdo.annotations.PersistenceCapable"); superType = null; // ?!? embeddable = (Class)Class.forName("javax.jdo.annotations.EmbeddedOnly"); - dto = QueryProjection.class; skip = (Class)Class.forName("javax.jdo.annotations.NotPersistent"); - Configuration configuration = new Configuration(entity, superType, embeddable, dto, skip); + Configuration configuration = new Configuration(entity, superType, embeddable, skip); configuration.setUseGetters(false); Processor processor = new Processor(processingEnv, configuration); processor.process(roundEnv); diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAAnnotationProcessor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAAnnotationProcessor.java index ba10f886b..0483b4f37 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAAnnotationProcessor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAAnnotationProcessor.java @@ -16,7 +16,6 @@ import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; -import com.mysema.query.annotations.QueryProjection; import com.mysema.query.apt.Configuration; import com.mysema.query.apt.Processor; @@ -28,7 +27,7 @@ import com.mysema.query.apt.Processor; @SupportedSourceVersion(SourceVersion.RELEASE_6) public class JPAAnnotationProcessor extends AbstractProcessor{ - protected Class entity, superType, embeddable, dto, skip; + protected Class entity, superType, embeddable, skip; @SuppressWarnings("unchecked") @Override @@ -38,7 +37,6 @@ public class JPAAnnotationProcessor extends AbstractProcessor{ entity = (Class)Class.forName("javax.persistence.Entity"); superType = (Class)Class.forName("javax.persistence.MappedSuperclass"); embeddable = (Class)Class.forName("javax.persistence.Embeddable"); - dto = QueryProjection.class; skip = (Class)Class.forName("javax.persistence.Transient"); Configuration configuration = createConfiguration(); @@ -52,7 +50,7 @@ public class JPAAnnotationProcessor extends AbstractProcessor{ } protected Configuration createConfiguration() throws ClassNotFoundException { - return new JPAConfiguration(entity, superType, embeddable, dto, skip); + return new JPAConfiguration(entity, superType, embeddable, skip); } } diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAConfiguration.java b/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAConfiguration.java index 3e84e1d32..ee75d71c9 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAConfiguration.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAConfiguration.java @@ -29,9 +29,8 @@ public class JPAConfiguration extends Configuration { public JPAConfiguration(Class entityAnn, Class superTypeAnn, Class embeddableAnn, - Class dtoAnn, Class skipAnn) throws ClassNotFoundException { - super(entityAnn, superTypeAnn, embeddableAnn, dtoAnn, skipAnn); + super(entityAnn, superTypeAnn, embeddableAnn, skipAnn); this.annotations = getAnnotations(); } diff --git a/querydsl-apt/src/test/java/com/mysema/query/domain/ProjectionTest.java b/querydsl-apt/src/test/java/com/mysema/query/domain/ProjectionTest.java new file mode 100644 index 000000000..910ba28f1 --- /dev/null +++ b/querydsl-apt/src/test/java/com/mysema/query/domain/ProjectionTest.java @@ -0,0 +1,41 @@ +package com.mysema.query.domain; + +import org.junit.Test; + +import com.mysema.query.annotations.QueryEntity; +import com.mysema.query.annotations.QueryProjection; +import com.mysema.query.types.expr.EString; + +public class ProjectionTest { + + @QueryEntity + public static class EntityWithProjection{ + + public EntityWithProjection(long id){ + + } + + @QueryProjection + public EntityWithProjection(String name){ + + } + } + + public static class DTOWithProjection { + + public DTOWithProjection(long id){ + + } + + @QueryProjection + public DTOWithProjection(String name){ + + } + } + + @Test + public void test() throws SecurityException, NoSuchMethodException{ + QEntityWithProjection.create(EString.create("")); + new QDTOWithProjection(EString.create("")); + } +} diff --git a/querydsl-collections/src/test/java/com/mysema/query/animal/Cat.java b/querydsl-collections/src/test/java/com/mysema/query/animal/Cat.java index d39bca956..3753b42dd 100644 --- a/querydsl-collections/src/test/java/com/mysema/query/animal/Cat.java +++ b/querydsl-collections/src/test/java/com/mysema/query/animal/Cat.java @@ -13,6 +13,7 @@ import java.util.Map; import com.mysema.query.annotations.PropertyType; import com.mysema.query.annotations.QueryEntity; +import com.mysema.query.annotations.QueryProjection; import com.mysema.query.annotations.QueryType; @QueryEntity @@ -49,6 +50,7 @@ public class Cat extends Animal { this.name = name; } + @QueryProjection public Cat(String name, int id) { this(name); this.id = id; diff --git a/querydsl-core/src/main/java/com/mysema/query/annotations/QueryProjection.java b/querydsl-core/src/main/java/com/mysema/query/annotations/QueryProjection.java index 99afd16d8..6447958be 100644 --- a/querydsl-core/src/main/java/com/mysema/query/annotations/QueryProjection.java +++ b/querydsl-core/src/main/java/com/mysema/query/annotations/QueryProjection.java @@ -5,15 +5,15 @@ */ package com.mysema.query.annotations; -import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; @Documented -@Target(TYPE) +@Target(ElementType.CONSTRUCTOR) @Retention(RUNTIME) /** * Annotation for APT based DTO query type generation. Annotate DTO types with this annotation. diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/domain/Family.java b/querydsl-hql/src/test/java/com/mysema/query/hql/domain/Family.java index abcbd21a5..d4753bf58 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/hql/domain/Family.java +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/domain/Family.java @@ -10,8 +10,9 @@ import com.mysema.query.annotations.QueryProjection; /** * The Class Family. */ -@QueryProjection public class Family { + + @QueryProjection public Family(Cat mother, Cat mate, Cat offspr) { } diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/domain/FooDTO.java b/querydsl-hql/src/test/java/com/mysema/query/hql/domain/FooDTO.java index c74ca92d6..882c7c6f8 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/hql/domain/FooDTO.java +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/domain/FooDTO.java @@ -13,7 +13,6 @@ import org.hibernate.annotations.CollectionOfElements; import com.mysema.query.annotations.QueryProjection; -@QueryProjection public class FooDTO { String bar; @Id @@ -25,9 +24,11 @@ public class FooDTO { public FooDTO() { } + @QueryProjection public FooDTO(long l) { } + @QueryProjection public FooDTO(long l, long r) { } } \ No newline at end of file