如何将计算字段映射到 JPA 实体?
How to map a calculated field to JPA entity?
我正在尝试找到一种方法,将计算字段放入 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; cannot be cast to class com.School
([Ljava.lang.Object; is in module java.base of loader 'bootstrap';
com.School is in unnamed module of loader
'app')",
如果我把num
作为School
实体的成员取出来,那就没有错误了。
那么,如何将计算值放入 JPQL 查询中以映射到实体中?
我认为你需要使用 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 生成的并且您不需要将其保存在数据库中,
那么你也可以这样做:
@Transient
@JsonView(FindSchoolView.class)
private String num = "9876";
我正在尝试找到一种方法,将计算字段放入 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; cannot be cast to class com.School ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; com.School is in unnamed module of loader 'app')",
如果我把num
作为School
实体的成员取出来,那就没有错误了。
那么,如何将计算值放入 JPQL 查询中以映射到实体中?
我认为你需要使用 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 生成的并且您不需要将其保存在数据库中, 那么你也可以这样做:
@Transient
@JsonView(FindSchoolView.class)
private String num = "9876";