2

I am new to Querydsl and trying to use it in a simple test project. I followed the official tutorial to configure my pom.xml, then mvn clean install was able to generated the Q Classes under target/generated-sources/java. But I got the error below:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project spring-jqgrid-tutorial: Compilation failure [ERROR] /D:/Project/spring-jqgrid-tutorial/src/main/java/org/krams/controller/UserController.java:[92,62] package QUser.user does not exist 

I think the root cause is the generated Q class source files were not compiled automatically into binary class files. I did verify there are no QUser.class under my project directory. I also tried to use build-helper-maven-plugin to add target/generated-sources/java as a source folder and specify target/generated-sources/java as an additional source root in apt-maven-plugin configuration. But I got no luck.

Here is my pom.xml

<properties> <querydsl.version>3.3.2</querydsl.version> <maven.compiler.plugin.version>3.1</maven.compiler.plugin.version> <maven.apt.plugin.version>1.1.1</maven.apt.plugin.version <maven.build.helper.plugin.version>1.8</maven.build.helper.plugin.version> <properties> <dependencies> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <scope>provided</scope> </dependency> <dependencies> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.plugin.version}</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>${maven.build.helper.plugin.version}</version> <executions> <execution> <id>add-source</id> <phase>process-classes</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>target/generated-sources/java</source> </sources> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>${maven.apt.plugin.version}</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor> <additionalSourceRoots> <additionalSourceRoot>target/generated-sources/java</additionalSourceRoot> </additionalSourceRoots> </configuration> </execution> </executions> </plugin> <plugins> 

And here is the generated QUser.java

package org.krams.domain; import static com.mysema.query.types.PathMetadataFactory.*; import com.mysema.query.types.path.*; import com.mysema.query.types.PathMetadata; import javax.annotation.Generated; import com.mysema.query.types.Path; import com.mysema.query.types.path.PathInits; /** * QUser is a Querydsl query type for User */ @Generated("com.mysema.query.codegen.EntitySerializer") public class QUser extends EntityPathBase<User> { private static final long serialVersionUID = -1712499619L; private static final PathInits INITS = PathInits.DIRECT2; public static final QUser user = new QUser("user"); public final NumberPath<Integer> age = createNumber("age", Integer.class); public final StringPath firstName = createString("firstName"); public final NumberPath<Long> id = createNumber("id", Long.class); public final StringPath lastName = createString("lastName"); public final StringPath password = createString("password"); public final QRole role; public final StringPath username = createString("username"); public QUser(String variable) { this(User.class, forVariable(variable), INITS); } public QUser(Path<? extends User> path) { this(path.getType(), path.getMetadata(), path.getMetadata().isRoot() ? INITS : PathInits.DEFAULT); } public QUser(PathMetadata<?> metadata) { this(metadata, metadata.isRoot() ? INITS : PathInits.DEFAULT); } public QUser(PathMetadata<?> metadata, PathInits inits) { this(User.class, metadata, inits); } public QUser(Class<? extends User> type, PathMetadata<?> metadata, PathInits inits) { super(type, metadata, inits); this.role = inits.isInitialized("role") ? new QRole(forProperty("role"), inits.get("role")) : null; } } 

Below is the only reference to QUser in UserController.java. repository is an instance of UserRepository repository, which extends QueryDslPredicateExecutor.

package org.krams.controller; import java.util.List; import org.krams.domain.QUser; import org.krams.domain.Role; import org.krams.domain.User; import org.krams.repository.UserRepository; import org.krams.response.JqgridResponse; import org.krams.response.StatusResponse; import org.krams.response.UserDto; import org.krams.service.UserService; import org.krams.util.JqgridFilter; import org.krams.util.JqgridObjectMapper; import org.krams.util.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; ... if (qUsername != null) users = repository.findAll(QUser.user.username.like(qUsername), pageRequest); 

Appreciate your help and comments. I can provide more information if required.

6
  • can we see UserController (imports and around line 92)? Commented Apr 13, 2014 at 9:12
  • @RC. edited my post and now you can see relevant part in UserController.java Commented Apr 13, 2014 at 9:30
  • without imports and package of UserController it's hard to tell Commented Apr 13, 2014 at 10:44
  • @RC. edited again. please find the imports and package above. Commented Apr 13, 2014 at 11:10
  • Test again. If I remove the reference to QUser in UserController, the build is successful. Commented Apr 13, 2014 at 11:39

3 Answers 3

1

I built everything from scratch again and finally Querydsl is working. I think this problem was caused by incompatible versions of spring data jpa and querydsl. Now I am using spring data jpa 1.3.2.RELEASE and querydsl 2.8.0., everything works perfectly. P.S. I removed the additionalSourceRoots and the build-helper-maven-plugin config. They are unnecessary.

Sign up to request clarification or add additional context in comments.

1 Comment

Update spring-core, spring-data-jpa, querydsl to newest versions. All works fine! spring-core: 4.0.3.RELEASE spring-data-jpa: 1.5.1.RELEASE querydsl: 3.3.2 My previous spring-data-jpa version must be too low.
1

It work for me like this

 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.10</version> <executions> <execution> <id>add-resource</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>src/main/sources</source> </sources> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>src/main/sources</outputDirectory> <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>3.4.3</version> </dependency> </dependencies> </plugin> 

Comments

0

Not sure, but in my current project (set up by someone else) I have two extra folders, and they are tied in in the generate-sources phase..

Hope this helps.

 <!-- MYSEMA generates a lot of query classes for the model in a pre-process step --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>${version.org.codehaus.mojo.build-helper-maven-plugin}</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/apt/</source> <source>${project.build.directory}/generated-sources/annotations/</source> </sources> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>${version.com.mysema.maven.apt-maven-plugin}</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/apt</outputDirectory> <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin> 

1 Comment

Interesting - what does ${version.com.mysema.maven.apt-maven-plugin} resolve to in your configuration?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.