QueryDSL自定义QType缩短实体关联查询路径可行性问询
完全可以实现,有两种成熟方案可供选择:
方案1:实体类加委托方法(最简便,无需修改构建配置)
直接在Foo实体类中添加快捷委托方法,同时加@Transient注解避免JPA识别为持久化字段,QueryDSL的APT处理器会自动识别生成对应查询路径:
import javax.persistence.Transient; public class Foo { private FooBar fooBar; @Transient public Bar getBar() { return fooBar != null ? fooBar.getBar() : null; } }
重新执行generate-sources构建后,自动生成的QFoo中就会自带bar属性,直接使用foo.bar.name写法查询即可,底层会自动映射为完整的foo.fooBar.bar.name关联路径。
方案2:自定义扩展查询类(无需修改原有实体逻辑)
如果不希望在实体类中增加非业务方法,可以通过修改APT配置扩展查询类实现:
- 调整
apt-maven-plugin配置,给自动生成的查询类加自定义后缀,避免和手动写的类冲突:
<plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> <options> <!-- 自动生成的查询类增加Base后缀 --> <querydsl.suffix>Base</querydsl.suffix> </options> </configuration> </execution> </executions> </plugin>
- 重新构建后,APT会生成
QFooBase自动生成类,你在同包下手动创建QFoo类继承它,添加自定义短路径:
import com.querydsl.core.types.PathMetadataFactory; // 导入自动生成的QBar类 import your.package.QBar; public class QFoo extends QFooBase { private static final long serialVersionUID = 1L; public static final QFoo foo = new QFoo("foo"); // 自定义短路径,映射到原有的fooBar.bar关联 public final QBar bar = new QBar(PathMetadataFactory.forProperty(getMetadata(), "fooBar.bar")); public QFoo(String variable) { super(Foo.class, PathMetadataFactory.forVariable(variable)); } // 其他构造方法按需补全即可 }
配置完成后直接使用QFoo.foo.bar.name即可正常查询,和原生生成的路径效果完全一致,也不会影响原有Eclipse Link插件的协同工作。
内容的提问来源于stack exchange,提问作者MelleD
相关产品推荐
相关产品推荐

