【问题标题】:How to map a calculated field to JPA entity?如何将计算字段映射到 JPA 实体?
【发布时间】: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 查询中以映射到实体中?

【问题讨论】:

    标签: java spring spring-boot jpa 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";
    

    【讨论】:

    • 是的,我最终做了一个单独的公式注释。你在便携性上是对的,但这是我愿意接受的负面因素。我会接受答案。干杯!
    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 2020-10-24
    • 2023-03-25
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2012-07-04
    相关资源
    最近更新 更多