【问题标题】:Spring Data or plain JPA with dynamic calculated column具有动态计算列的 Spring Data 或普通 JPA
【发布时间】:2018-12-06 01:44:22
【问题描述】:

伙计们。 我有一些商店物品,它们有坐标(纬度和经度)。我想暴露用户当前位置和商店之间的距离。问题是这个字段是动态的,我不能用 Shop 实体中的常规字段来表示值。如果我放这样的东西

@Transient
private BigDecimal distance;

Spring Data 无法映射此属性,因为它被忽略了。 我可以使用 jdbcTemplate 和原始查询来实现,但是编码太多了 :)

所以基本上,我的问题是如何将动态计算的添加列映射到没有持久属性的 JPA 实体

最好的问候。

【问题讨论】:

    标签: hibernate jpa spring-data jdbctemplate criteria-api


    【解决方案1】:

    你可以使用:

    1) @PostLoad 注释,用于在应用程序级别对您的瞬态属性进行自定义计算:

    @PostLoad
    public void calculateDistance() {
        this.distance = ...;
    }
    

    2) @Formula 注释在数据库级别进行计算(使用您的本地 SQL 方言):

    @Formula(value = "...") // your calculation here in native SQL
    private BigDecimal distance;
    

    (在这种情况下必须排除@Transient注解。)

    【讨论】:

    • 我可以将@Formula 与preparedStatemens 一起使用吗?
    • @Rostislav No. @Formula 适用于 数据库级别 - 它是本机 sql 语句的一部分(请参阅我提供的链接)
    • 是的,我看到了。所以在这种情况下,上述方法中的任何内容都不起作用...查询已准备好语句和自对象字段(列)引用。我想我应该使用 jdbcTemplate ...
    • @Rostislav 您的问题是:“如何将动态计算的附加列映射到没有持久属性的 JPA 实体?” - 我回答了。
    • 你说得对,我的朋友。我会将您的答案标记为解决方案
    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2021-06-28
    • 2023-02-03
    • 2017-07-30
    相关资源
    最近更新 更多