如何将计算字段映射到 JPA 实体?
Posted
技术标签:
【中文标题】如何将计算字段映射到 JPA 实体?【英文标题】:How to map a calculated field to JPA entity? 【发布时间】:2021-07-23 06:10:02 【问题描述】:我正在尝试找到一种方法将计算字段放在 JPQL 查询中以映射到 Spring Boot 中的实体。
我刚刚列出了一个静态数字的示例,但我打算将来也将它用于聚合。
@NamedQuery(name = "findSchool",
query = "SELECT s, 9876 as num " +
"FROM School s " +
"WHERE s.id = :schoolId)
public class School implements Serializable
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(updatable = false, nullable = false)
@JsonView(FindSchoolView.class)
private UUID id;
@Transient
@JsonView(FindSchoolView.class)
private String num;
当我尝试运行查询时,我不断收到此消息:
"class [Ljava.lang.Object; 不能转换为 com.School 类 ([Ljava.lang.Object; 位于加载程序'bootstrap'的模块 java.base; com.School 位于加载程序的未命名模块中 '应用')",
如果我取出num
作为School
实体的成员,那么就没有错误。
那么,如何将计算值放入 JPQL 查询中以映射到实体中?
【问题讨论】:
【参考方案1】:我认为您需要使用formula
@NamedQuery(name = "findSchool",
query = "SELECT s" +
"FROM School s " +
"WHERE s.id = :schoolId)
public class School implements Serializable
@Formula(value = "'9876'")
@JsonView(FindSchoolView.class)
private String num;
请注意,该值不必是常数,但您可以使用任何本机查询(尽管可能会失去一点可移植性)。
如果不是SQL生成的,不需要保存在db中, 那么你也可以这样做:
@Transient
@JsonView(FindSchoolView.class)
private String num = "9876";
【讨论】:
是的,我最终做了一个单独的公式注释。你在便携性上是对的,但这是我愿意接受的负面因素。我会接受答案。干杯!以上是关于如何将计算字段映射到 JPA 实体?的主要内容,如果未能解决你的问题,请参考以下文章
使用 JPA 2.1,我如何将本机查询结果映射到 @Transient 字段(taht is a Set)?