Spring JPA 选择 null 作为字段对象而不是具有 null 值的元组

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

我有两个 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
查询中可行吗?

spring spring-data-jpa spring-data jpql jparepository
1个回答
0
投票

最简单的解决方案是使用

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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.