当value1为NULL时,Hibernate实体连接替换value2

时间:2017-01-25 10:27:32

标签: java sql hibernate

我正在使用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查询的逻辑?非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

我不确定您是否可以在字段(name)级别提供注释来实现此目的。我的猜测是,如果存在类似的东西,那么它可能会导致更新的行为方式相同。 (用教授的名字覆盖老师的名字)

其他几种解决方案:

  1. Hibernate的Formula注释:
    创建另一个变量说actualName并提供带有Coalesce 的公式注释(我之前使用它来在一个字段为空时返回另一个字段)

    @Formula("COALESCE(nullableField, backupField)")
    

    我不确定你是否可以在其中使用映射实体,如果不是,你必须使用JoinColumnOrFormula注释并为此编写查询。

  2. 为此新字段 actualName创建一个getter,它会检查教授的名字是否存在然后返回。否则返回老师的名字。这将消除编写另一个查询的需要。

  3. 您还可以修改教师课程中name字段的getter,以返回您想要的其他字段。 注意:如果教授的名字存在,这也会导致教师桌上的更新操作用教授的名字替换教师姓名。根本不推荐