【问题标题】:How to have a calculated column in table using hibernate如何使用休眠在表中具有计算列
【发布时间】:2020-11-08 14:18:20
【问题描述】:

我想向现有实体添加一个新的瞬态列,该列在数据库中不存在,将在调用获取表并填充新列的查询时计算。

我尝试了以下方法:

对于以下实体:

A {
@Column
Integer x;
@Transient 
Integer y;
}

我想创建一个在 A 对象中返回结果的查询:

query (named readA): select x, 1 from A;

List<A> query = em().createNamedQuery('readA').getResultList();

我的方法失败了,有什么建议可以做到吗?

【问题讨论】:

  • 你能解释一下你想在这里做什么...
  • 当然,我想在表中有一个计算列,该列在数据库的表中不存在,并且只会在一个获取表并计算该列的查询中计算。这够清楚了吗?
  • 那为什么不使用@Formula呢?
  • 公式将在每次我填充表格时进行连接(我的真实表格计算此列与另一个表格进行连接),这将导致性能不佳..我只想填充此列一次我称这个查询。

标签: java hibernate hql


【解决方案1】:

由于您只希望对这一个查询使用此功能,因此您应该使用带有专用查询的 DTO 投影。您可以为此使用 JPQL 构造函数语法。

类似于以下内容:

SELECT NEW com.mycompany.package.MyDto(alias.x, 1)
FROM A alias

尽管与用途相匹配,但您需要该类中的构造函数。

话虽如此,我认为这是Blaze-Persistence Entity Views 的完美用例。

Blaze-Persistence 是基于 JPA 的查询构建器,它支持 JPA 模型之上的许多高级 DBMS 功能。我在它之上创建了实体视图,以允许在 JPA 模型和自定义接口定义模型之间轻松映射,例如 Spring Data Projections on steroids。这个想法是您以您喜欢的方式定义您的目标结构,并通过 JPQL 表达式将属性(getter)映射到实体模型。由于属性名称用作默认映射,因此您通常不需要显式映射,因为 80% 的用例是拥有作为实体模型子集的 DTO。

带有实体视图的投影看起来像下面这样简单

@EntityView(A.class)
interface MyDto {
    long getX();
    @Mapping("1") // This is where your JPQL expression goes
    int getY();
}

查询是将实体视图应用于查询的问题,最简单的就是通过 id 进行查询。

MyDto dto = entityViewManager.find(entityManager, MyDto.class, id);

但是 Spring Data 集成允许您几乎像 Spring Data Projections 一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

List<MyDto> findAll();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 2016-06-26
    • 1970-01-01
    • 2013-11-03
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多