gpt4 book ai didi

java - Hibernate 实体上的 SpEL

转载 作者:行者123 更新时间:2023-11-30 03:32:46 25 4
gpt4 key购买 nike

我有一种情况,我有一个 @ManyToOne 关系,如下所示,

public class PersonEntity implements Serializable {
@Id
@Column(...)
private String personID;

@Basic
@Column(...)
private String parentID;

@ManyToOne(fetch = FetchType.LAZY, targetEntity=PersonEntity.class)
@JoinColumn(name = "personID")
@Fetch(FetchMode.SELECT)
private PersonEntity parentPerson;
}

正如你在上面看到的,我有 Person,它的父级也是一个人。现在,在 99% 的业务场景中,我只需要父级的名称。因此,访问整个父对象是一种矫枉过正的行为。

因此,为了克服这个问题,存在三种可能的解决方案:

  1. 修改数据库表并将父级名称添加到表本身。
  2. 创建一个 View 来执行与上述相同的工作。
  3. 创建一个人名 @Transient 变量,然后在需要时插入该值。

现在,在第三个上下文中,受到 Spring @Projection (Spring DATA REST) 的启发,我想使用 SpEL 尝试如下所示的操作。但是,它似乎不起作用。

public class PersonEntity implements Serializable {
@Id
@Column(...)
private String personID;

@Basic
@Column(...)
private String parentID;

@Transient
@Value("#{@parentRepository.findOne(target.getParentID()).getParentName()}")
private String parentName;
}

有人可以帮助我理解为什么这不起作用吗?除了上面列出的之外还有其他选择吗?

最佳答案

由于您使用的是 Hibernate,因此您可以执行以下操作:

public class PersonEntity implements Serializable {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentID")
@Fetch(FetchMode.SELECT)
private PersonEntity parent;

@Basic(fetch = FetchType.LAZY)
@Formula("select p.name from person p where p.id = parentID")
private String parentName;
}

注意:Formula是Hibernate特定的注释。

关于java - Hibernate 实体上的 SpEL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com