【发布时间】:2011-02-22 14:38:51
【问题描述】:
除了将值绑定到null之外,有没有办法让hibernate通过使用“is null”来生成sql查询?我正在使用 DB2,我在下面详细解释了:
在我的项目中,我使用了以下持久类来映射到 DB 表(我使用 ElementCollection 来映射 A 实例中的 B 实例集合):
@Entity
@Table(name = "A")
public class A implement Serializable {
@Id
@Colum(name = "A_A")
private a_A;
@ElementCollection(fetch = FetchType.EAGER)
@JoinTable(name = "B", joinColumns = @JoinColumn(name = "B_A", nullable = false))
@Fetch(FetchMode.SUBSELECT)
private Set<B> A_Bs = new HashSet<B>();;
....
}
@Embeddable
@Table(name = "B")
@Access(AccessType.FIELD)
public class B implements Serializable {
@Column(name B_C)
private String C;
@Column(name B_D)
private String D;
.....
}
当我尝试更新A的实体实例时,可以看到Hibernate自身生成的以下sqls(由于B中没有id定义,一般情况下还是盲目更新集合才有意义):
delete from B where B_A=? and B_C=? and B_D=?
insert into B (B_A, B_C, B_D) values (?, ?, ?)
问题是 B_C 和 B_D 可以为空,而 B_D 是另一个表(对象)的外键。
所以如果 B_C 或 B_D 的原始值为 null,则删除 sql 将变为:
delete from B where B_A=<somevalue> and B_C=null and B_D=null
在 DB2 中,如果您有“=null”,则 DB2 不会删除任何行,最终第二次插入查询将失败。但在我的应用程序中,我必须将 null 作为 B_C 或 B_D 的值,所以我希望 hibernate 生成这样的查询:
delete from B where B_A=? and (B_C is null or B_C=?) and (B_D is null or B_D=?)
有没有办法做到这一点?
请帮忙。多谢。
【问题讨论】:
标签: hibernate