【问题标题】:how to let Hibernate to generate "is null" instead of bining column value to null如何让 Hibernate 生成“为空”而不是将列值合并为空
【发布时间】: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


    【解决方案1】:

    为什么不规范化架构,让 B 成为自己的实体,在 B 中放置代理主键,并在 A 和 B 之间建立 OneToMany 关系?

    这样会更有效率(无需在每次更新集合时全部删除并重新插入)并且您不会再遇到这些问题。

    【讨论】:

    • 您好 JB,感谢您的回复。我个人不反对使用onetomany,只有2个问题:
    • 1.由于 Hibernate 支持 ElementCollection,那么它应该为我生成正确的 sql,我想我一定错过了这样做的技巧。
    • 2.如果我使用单向OneToMany映射,我在网上得到的所有示例都使用映射表,但是在我们的db中,我们只有A和B表,我们没有映射表A_B。这个可以吗?如果你能给我一个简单的例子,那就太好了。再次感谢。
    • 您可能有一个单向 OneToMany,其中 B 中的外键指向 A。只需将 OneToMany 注释与 JoinColumn 注释一起使用,如下所述:docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/…
    • 谢谢。如果您可以回答我的第一个问题,或者确认它无法解决(没有技巧),我会接受您的回答。 :)
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多