【问题标题】:Adding new transient field to existing @Enity将新的瞬态字段添加到现有的 @Enity
【发布时间】:2017-09-18 10:45:05
【问题描述】:

我有这样的实体

@Entity
class Dates{

        @Column(name="day");
        private String day;


        @Column(name="year");
        private String year;

        //getters and setters


        //this is I want to have like dateAndyear=day+"-"+year or even create date object based on day and year
        private String dateAndyear;


}

我希望在创建实体时自动在实体内部设置此字段 dateAndyear。之后我想在 Criteria API 的“where”子句中使用这个字段。

【问题讨论】:

  • 你想用一些代码来详细说明吗?
  • 我的最终目标是从日期和年份字段创建 Date 对象,并使用 Criteria Builder 中的“between”函数来搜索实体
  • 为什么您的数据库有dayyear 列,更重要的是为什么它们是Strings?您应该专注于修复设计,而不是试图解决由它引起的问题。
  • 这有一个明确的商业原因。这不是这个问题的主题。这是分布式系统,通过 ETL 通过 DB 交换数据,这是我无法控制的
  • 你不必告诉我童话故事。我已经听过足够多的“商业理由”来了解这意味着什么。如果您的数据库支持计算列,您可以尝试(或为其创建触发器)。如果您无法触摸数据库,那么您将不得不忘记在条件查询中使用它的计划并想出其他东西。

标签: java hibernate jpa entity transient


【解决方案1】:

瞬态字段不是序列化过程的一部分,也不会保留在数据库中,因此不能在标准 api 中用作 where 子句。 但是你总是可以在创建时使用构造函数来初始化它们,hibernate 内部永远不会初始化它们。

【讨论】:

  • 没有办法吗? predicates.add(criteriaBuilder.equal(root.get("dateAndyear"), date)); ?
  • 既然数据库中不存在瞬态字段,而且数据库中执行的是 Criteria 查询,你真的需要问吗?
  • Puneet/Billy 是正确的,transient 不能用于查询。您只能使用数据库中存在的字段,因为在那里执行查询。
猜你喜欢
  • 2016-10-28
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2013-10-26
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多