java 8+ 项目必须用 annotationprocessor 而非 apt,因 querydsl-apt 的 apt 插件已废弃;spring boot 2.4+ 需显式配置 annotationprocessorpaths,且 querydsl-jpa 与 querydsl-apt 版本须严格一致(如均为 5.0.0),并适配 jakarta ee 9+。

Querydsl代码生成插件选哪个:apt 还是 annotationProcessor?
Java 8+ 项目里,querydsl-apt 的 apt 插件已废弃,必须用 annotationProcessor。Maven 中若还写 apt-maven-plugin,编译会静默跳过生成,Q类一个都不出来——连报错都没有,最坑。
- Spring Boot 2.4+ 默认禁用
annotationProcessor路径扫描,得显式开启:maven-compiler-plugin配置里加<annotationprocessorpaths></annotationprocessorpaths>,不能只靠dependencies里的provided依赖 -
querydsl-jpa和querydsl-apt版本必须严格对齐,比如都用5.0.0;混用5.0.0+4.4.0会导致QEntity字段缺失或类型错误 - 实体类上没加
@Entity或用了 Lombok 的@Data却没配lombok.config开启lombok.anyConstructor.addConstructorProperties=true,Q类可能生成失败或字段为空
Querydsl依赖怎么配才不冲突:JPA、Spring Data、Gradle 多版本陷阱
Spring Boot 3.x 默认用 Jakarta EE 9+(jakarta.persistence.*),但老版 querydsl-jpa(如 4.4.0)仍依赖 javax.persistence.*,直接引入会 ClassNotFound。
- Spring Boot 3+ 必须用
querydsl-jpa5.0.0及以上,且确认其 POM 里引用的是jakarta.persistence-api - 如果项目里手动引入了
hibernate-core,版本要和 Spring Boot 的spring-boot-starter-data-jpa内置版本一致,否则QuerydslJpaPredicateExecutor可能因Predicate解析器不兼容而抛IllegalArgumentException: unexpected predicate - Gradle 用户注意:
annotationProcessor不会自动继承compileOnly的依赖,querydsl-apt必须单独声明在annotationProcessor配置块中,不能只写在implementation
Q类生成路径不对、找不到 QUser 怎么办
生成的 QUser.java 默认在 target/generated-sources/java/ 下,但 IDE(尤其 IntelliJ)常不识别该目录为 source root,导致编译报错“cannot resolve symbol QUser”。
- Maven 用户:确保
maven-compiler-plugin启用了generatedSourcesDirectory,并配合build-helper-maven-plugin把该路径加入 source roots - IntelliJ:右键
target/generated-sources/java→ “Mark as Generated Sources Root”,别信自动导入——它经常漏掉 - 如果用了
@QueryEntity但没生效,检查是否在实体类同包下存在package-info.java且含@QueryEntities注解,否则 Querydsl 默认只扫@Entity类,忽略普通 POJO
Spring Data JPA 继承 QuerydslPredicateExecutor 编译不过
接口继承 QuerydslPredicateExecutor<user></user> 后编译报错 “cannot access QUser”,通常不是代码问题,而是 Q类没被正确编译进 classpath 或类型擦除干扰。
立即学习“Java免费学习笔记(深入)”;
- 确认
QUser所在包与User实体完全一致(包括子包),Querydsl 默认按包名映射,com.example.model.User对应com.example.model.QUser,错一个字母都不行 - Spring Boot 3.1+ 若启用
spring.jpa.hibernate.use-new-id-generator-mappings=true(默认值),需确保QUser中主键字段类型与实体中@Id字段实际类型一致(例如Longvslong),否则泛型推导失败 - IDE 缓存常导致假性报错:Clean 项目后,先
mvn compile命令行跑通,再刷新 IDEA,别直接点 rebuild
QUser 发十分钟呆。










