JPA - 映射来自实体的附加计算值

Posted

技术标签:

【中文标题】JPA - 映射来自实体的附加计算值【英文标题】:JPA - mapping additional calculated value from an entity 【发布时间】:2019-06-17 12:54:25 【问题描述】:

我有一个名为Taxi 的实体,其中保存了它的位置信息。我有一个存储过程,它返回这个实体字段和一个名为“距离”的附加字段,由存储过程计算。问题是我从显然没有距离字段的存储过程中返回出租车实体,我如何获得这个计算出的距离字段?

看起来是这样的:

List<Taxi> getTaxisAroundMe(Integer customerId,Integer distance); 

【问题讨论】:

【参考方案1】:

介绍:

 @Entity
 @Immutable
 public class TaxiReadOnly extends Taxi 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", updatable = false, nullable = false)
    private Long /*?*/ id;

    private Integer distance;
    //get+set
 

然后:

public interface TaxiReadOnlyRepository 
   List<TaxiReadOnly> calcDistance(/*input params*/);



// as before
public interface TaxiRepository extends CrudRepository<Taxi, Long>,
  //but now with
  TaxiReadOnlyRepository 


// and
public class TaxiReadOnlyRepositoryImpl implements TaxiReadOnlyRepository 
   @PersistenceContext
   private EntityManager em;
   @Override
   public List<TaxiReadOnly> calcDistance(/*input params*/) 
       return em.createNativeQuery("BEGIN call_ur_procedure(:inParam1, ...); END;")
      //.setParameter("inParam1", inParam1)
      .getResultList();
  

见:

https://thoughts-on-java.org/hibernate-tips-map-view-hibernate/ https://dzone.com/articles/calling-stored-procedures-from-spring-data-jpa

【讨论】:

非常感谢,TaxiReadOnly 工作正常,但现在当我从 Taxi 中找到所有内容时,它显示 Unknown column 'taxi0_.distance' 现在我已经复制了 Taxi 并将其命名为 TaxiReadOnly 并仅添加了 Entity 和 @Immutable 注释,并为其创建了 repo 类,这似乎工作正常,但我不是这样做的“正确”它,任何帮助将不胜感激

以上是关于JPA - 映射来自实体的附加计算值的主要内容,如果未能解决你的问题,请参考以下文章

如何将计算字段映射到 JPA 实体?

JPA:将 OneToOne Long 值(不是实体)映射到另一个不是主键的表列

JPA忽略逐列值映射

JPA一对多映射

jpa中的可空映射映射

JPA多对多映射