我正在使用Hibernate并尝试在SELECT
查询的实体中构建下一个逻辑。创建一个连接列,其中if教授的name = NULL
的值,然后选择教师姓名的值。
教师代码表:
@Entity
@Table(name = "teacher")
public class Teacher {
@Id
@Column(name = "id_number)
private String id;
@OneToOne
@JoinColumn(name = "t_name")
private Professor name;
// Getters and Setters ...
}
教授代码表:
@Entity
@Table(name = "professor")
public class Professor{
@Id
@Column(name = "id_number)
private String id;
@Column(name = "p_name")
private String name;
// Getters and Setters ...
}
使用SQL查询示例:
select
t.id_number as "Identification Number",
isnull(p.p_name, t.t_name) as "Name"
from teacher t
left join professor p
on t.t_name = p.p_name
where id_number in (23, 24, 25, 26, 27)
我应该在实体中更改以复制上述SQL查询的逻辑?非常感谢您提供的任何帮助。
答案 0 :(得分:2)
我不确定您是否可以在字段(name
)级别提供注释来实现此目的。我的猜测是,如果存在类似的东西,那么它可能会导致更新的行为方式相同。 (用教授的名字覆盖老师的名字)
其他几种解决方案:
Hibernate的Formula注释:
创建另一个变量说actualName
并提供带有Coalesce 的公式注释(我之前使用它来在一个字段为空时返回另一个字段)。
@Formula("COALESCE(nullableField, backupField)")
我不确定你是否可以在其中使用映射实体,如果不是,你必须使用JoinColumnOrFormula注释并为此编写查询。
为此新字段 actualName
创建一个getter,它会检查教授的名字是否存在然后返回。否则返回老师的名字。这将消除编写另一个查询的需要。
您还可以修改教师课程中name
字段的getter,以返回您想要的其他字段。 注意:如果教授的名字存在,这也会导致教师桌上的更新操作用教授的名字替换教师姓名。根本不推荐