Hibernate 实体上的 SpEL
SpEL on Hibernate Entity
我有一种情况,我有一个@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;
}
正如你在上面看到的,我有一个人,他的 parent 也是一个人。现在,在 99% 的业务场景中,我只需要 parent 的名称。因此,访问整个 parent object 是一种矫枉过正。
所以,为了克服这个问题,有三种可能的解决方案:
- 修改数据库 table 并将 parent 名称添加到 table 本身。
- 创建一个视图来完成与上面相同的工作。
- 创建一个人名的@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 的注解。
我有一种情况,我有一个@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;
}
正如你在上面看到的,我有一个人,他的 parent 也是一个人。现在,在 99% 的业务场景中,我只需要 parent 的名称。因此,访问整个 parent object 是一种矫枉过正。
所以,为了克服这个问题,有三种可能的解决方案:
- 修改数据库 table 并将 parent 名称添加到 table 本身。
- 创建一个视图来完成与上面相同的工作。
- 创建一个人名的@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 的注解。