有没有办法让hibernate通过使用“is null”来生成sql查询,除了将值绑定到null之外?我正在使用DB2,我在下面解释了详细信息:
在我的项目中,我使用以下持久化类映射到数据库表(我使用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的实体实例时,我可以看到自己生成的以下sqls Hibernate(因为B中没有id定义,所以在一般情况下只是盲目地更新集合是有意义的):< / p>
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=?)
有办法做到这一点吗?
请帮助。非常感谢。
答案 0 :(得分:2)
为什么不规范你的模式,使B成为自己的实体,在B中放置代理主键,并在A和B之间建立OneToMany关系?
这样效率会更高(每次更新集合时无需删除所有内容并重新插入),您将不再遇到这些问题。