QueryDSL 代码风格:从查询方法返回值

问题描述 投票:0回答:1

我正在学习 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 querydsl
1个回答
0
投票

因此,在第一个示例中:

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();

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

© www.soinside.com 2019 - 2024. All rights reserved.