实体继承无QueryDsl支持的外部类时,如何生成Query类?
解决方案
手动编写自定义Q类
禁用QueryDsl自动生成QApple类,手动编写QApple类,避免引用不存在的QExternalClass。示例代码:public class QApple extends EntityPathBase<Apple> { private static final long serialVersionUID = 1L; public static final QApple apple = new QApple("apple"); // 仅定义Apple自身的字段,移除自动生成的_super字段 public final StringPath name = createString("name"); // 其他业务字段... public QApple(String variable) { super(Apple.class, forVariable(variable)); } public QApple(Path<? extends Apple> path) { super(path.getType(), path.getMetadata()); } public QApple(PathMetadata metadata) { super(Apple.class, metadata); } }同时在Maven的QueryDsl插件配置中,通过
excludes参数排除Apple类的自动生成,避免覆盖手动编写的Q类。配置QueryDsl插件禁用父类Q类生成
在Maven的QueryDsl APT插件中添加参数,阻止生成父类相关的Q类引用。示例配置:<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>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> <!-- 排除外部父类,避免生成相关Q类引用 --> <excludedClasses> <param>com.example.models.ExternalClass</param> </excludedClasses> <!-- 或者禁用父类型扩展生成 --> <options> <option>querydsl.generateSupertypeExtensions=false</option> </options> </configuration> </execution> </executions> </plugin>用组合代替继承
如果业务逻辑允许,将Apple类的继承关系改为组合:把ExternalClass作为Apple的一个字段而非父类。示例代码:public class Apple implements Serializable { private ExternalClass externalProps; // Apple自身的字段和方法... }这种方式彻底规避了父类相关的QueryDsl生成问题,但需要同步调整业务代码的调用逻辑。
使用QueryDsl类型映射忽略父类
在项目中添加一个配置类,通过@TypeMappings注解标记ExternalClass为跳过处理的类型:@TypeMappings({ @TypeMapping(type = ExternalClass.class, skip = true) }) public class QueryDslConfig {}这样QueryDsl在处理Apple的父类时会自动跳过,不会尝试生成QExternalClass的引用。
内容的提问来源于stack exchange,提问作者FreudK
相关产品推荐
相关产品推荐

