提问人:Joseph Larson 提问时间:11/17/2023 最后编辑:Mark RotteveelJoseph Larson 更新时间:11/18/2023 访问量:23
QueryDSL 代码样式:从 Query 方法返回值
QueryDSL Code Style: return value from Query methods
问:
我正在学习QueryDSL。
我看到的所有代码都如下所示:
JPAQuery<Member> query = queryFactory.selectFrom(member);
query = query.method1().method2().method3();
让你像这样链接的各种方法实际上会返回一个不同的对象吗?或者我可以这样写:
JPAQuery<Member> query = queryFactory.selectFrom(member);
query.method1();
query.method2();
query.method3();
(基本问题是某些方法位于超类上,因此它们不会返回实际的类。
显然,我更喜欢第一种工作方式——它干净明了。
答:
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
谢谢。我以为它可能会这样做,但我遵循的教程并不清楚。
评论