我有两个 Spring JPA 实体,我想在它们的某些字段集上写一个
left join
。假设我有
class Foo {
Long id; // PK
Long barId; // FK to Bar
Long field;
}
class Bar {
Long id; // PK
Long field;
}
我还有2条Java记录
record ThinBar(Long barId);
record FooWithBar(Long fooId, Long fooField, ThinBar bar);
现在,如果我在
JpaRepository<Foo, Long>
中编写这段代码
@Query("select new com.example.FooWithBar(foo.id, foo.field, new com.example.ThinBar(bar.id)) from Foo foo left join Bar bar on foo.barId = bar.id")
FooWithBar get(Long fooId);
如果匹配的
bar
不存在,结果将为 FooWithBar(id, field, ThinBar(null))
。然而,我想要实现的是FooWithBar(id, field, null)
。这在 Spring JpaRepository
查询中可行吗?
最简单的解决方案是使用
CASE WHEN THEN
语句,但不幸的是,JPQL 不允许除标量之外的任何内容作为值,并且 new
运算符不是标量。
另一方面,可能的是重写记录的构造函数并操作可为空字段以达到既定目的。因此,这是可能的
record FooWithBar(Long fooId, Long fooField, ThinBar bar) {
public FooWithBar(Long fooId, Long fooField, ThinBar bar) {
this.fooId = fooId;
this.fooField = fooField;
if (bar.barId != null) {
this.bar = bar;
} else {
this.bar = null;
}
}
}