在 @Formula 中,引用此公式之外的连接依赖项(不是 Sub-Select 也不是此对象)

In a @Formula, Refer to a Join Dependency Outside this Formula (not a Sub-Select and not this object)

我正在编写一个 Hibernate @Formula,它将 return 某个值。 @Formula 存在于某个域对象 (Plans.java) 中。

但是,该值取决于它目前不知道的未来 JOIN。也就是说,

计划Class

@Formula("CASE" + 
         "    WHEN " + 
         "                     nv.organizationalstat = 'FELLOW' " + 
         "                     AND nv.hi_education_cd IS NOT NULL " +
         "                     ... " + // Some PLANS_T fields here, which are OK, since it's this object
                                       // Independent SUB-Selects are also OK
                                       // But what doesn't work is the Future Join dependency, "nv"
         "    THEN 1 " +
         "    ELSE 0 " + ...

构建查询时,我与另一个 table、NVTable

进行了连接
     Root<NVTable> nvRoot = criteriaQuery.from(NV.class);
     Join<Object,Object> plans = nvRoot.join("plans", JoinType.LEFT);

@Formulas 在我有独立的 Sub-Selects 时工作,比如它们里面的 (SELECT .. FROM ..),或者如果它们都严格地在这个对象内。但是我如何包含一个 Future Join 的字段,它是 not 一个独立的 Sub-Select?

那不可能,您必须在子查询中进行单独的连接。

话虽如此,这是 Blaze-Persistence Entity Views 的完美用例。

Blaze-Persistence 是基于 JPA 的查询构建器,它支持基于 JPA 模型的许多高级 DBMS 功能。我在它之上创建了实体视图,以允许在 JPA 模型和自定义接口定义的模型之间轻松映射,类似于 Spring 类固醇数据投影。这个想法是您按照自己喜欢的方式定义目标结构,并通过 JPQL 表达式将属性(getter)映射到实体模型。由于属性名称用作默认映射,因此您大多不需要显式映射,因为 80% 的用例都具有作为实体模型子集的 DTO。

假设您有这样的实体模型

@Entity
public class NV {
    @Id
    Integer id;
    String organizationalstat;
    String hiEducationCd;
    @ManyToOne
    Plans plans;
}

@Entity
public class Plan {
    @Id
    Integer id;
}

您的模型的 DTO 映射可能看起来像下面这样简单

@EntityView(Nv.class)
interface NvDto {
    Integer getId();
    @Mapping("CASE WHEN organizationalstat = 'FELLOW' AND hiEducationCd IS NOT NULL AND plans.someField = 'ABC' THEN 1 ELSE 0 END")
    Integer getYourFormulaResult();
}

查询就是将实体视图应用于查询,最简单的就是通过 id 进行查询。

NvDto dto = entityViewManager.find(entityManager, NvDto.class, id);

但是 Spring 数据集成让您几乎可以像 Spring 数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

它只会获取您告诉它获取的映射。