【问题标题】:Hibernate/JPA add a calculated fieldHibernate/JPA 添加计算字段
【发布时间】:2017-08-02 07:59:36
【问题描述】:

我目前正在将 hibernate .hbm.xml 文件转换为注释,并且遇到了与此非常相似的问题 Adding a calculated field on jpa + jackson

我有一个数据库表,其中包含一些字段,包括 first_name 和 last_name,因此这些字段应该是持久的(这可以按预期工作)。

但现在我有一个方法 getFullName()

  // ?????
public String getFullName() {
   return getFirstName() + " " + getLastName();
}

我不知道应该在方法中添加哪个注释? (尝试过@Transient、@Formula、@Basic、@Column、.... fullName 不应该是持久的)

问题是我使用全名来创建订单

Order.asc("fullName");

然后在方法中使用

public List<Student> findAll(Session session, Order order) {
  Criteria crit = session.createCriteria(Student.class);
  if (null != order) {
    crit.addOrder(order);
  }
  return crit.list();
}

.................................................. ..........

我目前的“解决方案”是

 @Formula("concat(first_name,' ',last_name)")
 private String name;

 @Override
 public String getFullName() {
   return getFirstName() + " " + getLastName();
 }

但这是多余的,并不是我真正想要的。

最后我想使用最新的Hibernate版本。

【问题讨论】:

    标签: java hibernate jpa hibernate-mapping hibernate-annotations


    【解决方案1】:

    如果fullName 不是持久化,那么您应该使用@Transient,而是使用javax.persistence

    另外,将@Formula("concat(first_name,' ',last_name)") 放在getFullName 上并删除getName -> 这实际上是不正确的,因为@Transient 和@Formula 不能很好地协同工作。 p>

    就像评论中所说,您可以创建自己的订单以添加到条件 api。

    【讨论】:

    • 感谢您的回答,实际上 fullName 仅“存在”作为这个 getter,所以没有字段(那个 'name' 应该意味着 fullName 是我刚刚添加的,因为没有它就无法工作)我总是收到“无法解析属性:fullName”错误:/这与 name 和 lastname 在超类中的事实有关吗?
    • 我了解 fullName 是如何存在的,这正是重点。您还可以尝试将@Transient(验证它是否正确)放在任何一种方式,然后像第一个代码中一样离开,然后简单地创建一个新订单,检查stackoverflow.com/questions/31281162/…,正确的答案显示了如何创建您的自己的订单。
    • 它成功了(在我的项目中进行了一些小的重构之后),非常感谢!
    • 很高兴听到:)
    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 2015-01-14
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多