在 @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
它只会获取您告诉它获取的映射。
我正在编写一个 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
它只会获取您告诉它获取的映射。