QueryDSL 代码样式:从 Query 方法返回值

QueryDSL Code Style: return value from Query methods

提问人:Joseph Larson 提问时间:11/17/2023 最后编辑:Mark RotteveelJoseph Larson 更新时间:11/18/2023 访问量:23

问:

我正在学习QueryDSL。

我看到的所有代码都如下所示:

JPAQuery<Member> query = queryFactory.selectFrom(member);
query = query.method1().method2().method3();

让你像这样链接的各种方法实际上会返回一个不同的对象吗?或者我可以这样写:

JPAQuery<Member> query = queryFactory.selectFrom(member);
query.method1();
query.method2();
query.method3();

(基本问题是某些方法位于超类上,因此它们不会返回实际的类。

显然,我更喜欢第一种工作方式——它干净明了。

Java 查询DSL

评论


答:

1赞 Georgii Lvov 11/18/2023 #1

因此,在第一个示例中:

JPAQuery<Member> query = queryFactory.selectFrom(member);
query = query.method1().method2().method3();

每个 , , 和 调用都会返回一个新对象,允许您将这些方法链接在一起。method1()method2()method3()JPAQuery<Member>

如果超类中的方法不返回实际类,则只要这些方法返回具有相同或兼容接口的对象,链接仍然有效。

在第二个示例中:

JPAQuery<Member> query = queryFactory.selectFrom(member);
query.method1();
query.method2();
query.method3();

这不会按预期工作,因为每个方法调用都对原始查询对象进行操作,并且您不会捕获方法返回的修改后的实例。

如果出于某种原因(例如,有条件地应用某些方法)需要中断链,则可以将中间结果分配给单独的变量:

JPAQuery<Member> query = queryFactory.selectFrom(member);
JPAQuery<Member> intermediateResult = query.method1();
if (someCondition) {
    intermediateResult = intermediateResult.method2();
}
query = intermediateResult.method3();

这允许您有条件地应用方法,然后根据您的逻辑继续链。

评论

0赞 Joseph Larson 11/18/2023
谢谢。我以为它可能会这样做,但我遵循的教程并不清楚。