Querydsl-APT未生成父模块Q类?多模块场景问题咨询
问题解答:Querydsl-APT生成Q类引用不存在的父类Q类
这不是正常现象,是Querydsl-APT配置或依赖处理的问题,核心是模块B的注解处理器没有正确识别模块A中JPA映射超类的元数据,错误生成了对未存在的Q_MyModule_A_Entity的引用。
问题原因分析
Querydsl-APT处理继承关系时,会根据父类的注解类型决定生成逻辑:
- 如果父类标注
@Entity,APT会期望存在对应的Q类,生成子类Q类时会继承它; - 如果父类标注
@MappedSuperclass,APT应该直接在子类Q类中生成父类的字段映射,而非引用父类的Q类。
你的情况里,模块B的APT错误将MyModule_A_Entity识别为需要生成Q类的实体,才会出现不存在的引用。
解决步骤
检查模块A的超类注解与依赖
- 确认
MyModule_A_Entity标注了@MappedSuperclass(而非@Entity),这是Querydsl区分映射超类和实体的关键; - 模块A的
pom.xml中需引入Querydsl的API依赖(无需APT依赖),确保模块B编译时能获取到超类的元数据:<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </dependency>
- 确认
调整模块B的Maven Compiler Plugin配置
- 确保模块A是模块B的
compile级依赖(而非provided或runtime),让APT能访问到模块A的编译后类文件; - 配置正确的JPA注解处理器,指定
annotationProcessorPaths避免依赖冲突:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>17</source> <!-- 替换为你的JDK版本 --> <target>17</target> <annotationProcessors> <annotationProcessor>com.querydsl.apt.jpa.JPAAnnotationProcessor</annotationProcessor> </annotationProcessors> <annotationProcessorPaths> <path> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <classifier>jpa</classifier> </path> <path> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin>
- 确保模块A是模块B的
清理并重新编译
- 执行
mvn clean install,先清理模块A和B的编译产物,再重新编译,确保APT能重新解析所有类的元数据。
- 执行
验证结果
正确配置后,生成的Q_MyModule_B_Entity应该直接继承EntityPathBase,并包含MyModule_A_Entity中所有字段的Querydsl映射,不会出现对Q_MyModule_A_Entity的引用。
内容的提问来源于stack exchange,提问作者Jin Kwon
相关产品推荐
相关产品推荐

