4

我有两个具有多对多关系的实体 CRImageType 和 CRVariable,如下所示:

CRImageType 实体:

@Entity
@Table(name = "imageviewer_crimagetype")
public class CRImageType implements Serializable   {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "ImTypeId")
    private Long imTypeId;

    @Column(name = "ImTypeName")
    private String imTypeName;

    @Column(name = "ImTypeDescription")
    private String imTypeDescription;

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name="imageviewer_imtype_variable", 
    joinColumns={@JoinColumn(name="ImTypeId")}, 
    inverseJoinColumns={@JoinColumn(name="VarId")})
    private Set<CRVariable> crvariables = new HashSet<CRVariable>();

CRV 变量实体:

@Entity
@Table(name = "imageviewer_crvariable")
public class CRVariable implements Serializable   {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "VarId")
    private Long varId;

    @Column(name = "VarName")
    private String varName;

    @Column(name = "VarDescription")
    private String varDescription;

    @ManyToMany(mappedBy="crvariables")
    private Set<CRImageType> crimagetypes = new HashSet<CRImageType>();

在我的数据库中,关系由两个表“imageviewer_crimagetype”和“imageviewer_crvariable”和第三个“imageviewer_imtype_variable”映射,用于它们的多对多关系。

我只想从表"imageviewer_imtype_variable"中删除关联记录。如何使用 HQL 查询来完成,因为我无法直接访问“imageviewer_imtype_variable 表。

我想要 SQL 查询的 HQL 等价物

delete from imageviewer_imtype_variable where ImTypeId='%%%'
4

5 回答 5

3

这是 JPA,而不是专门的 Hibernate。如果您在 API 的上下文中搜索,而不是在实现中搜索,那么您在此处有一个标准化的 API 会更容易找到答案。

做到这一点的方法(据我记得,我不经常使用多对多关系)是从彼此的集合映射字段中删除相关实体。因此,如果您有 EntityA 和 EntityB,则从 EntityB 中删除 EntityA,从 EntityA 中删除 EntityB。然后应该触发持久性提供程序以从连接表中删除记录。

本机查询应该只是 IMO 的最后手段。

于 2012-11-08T16:17:56.787 回答
1
  • 您可以执行本机 SQL 查询:

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch18.html#querysql-creating

所以在你的情况下,类似:

session.createSQLQuery("DELETE FROM imageviewer_imtype_variable").executeUpdate();
  • 您还可以在CrImageType实体中指定自定义本机 SQL DELETE 查询:

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch18.html#querysql-cud

于 2012-11-08T15:53:50.993 回答
1

根据我的经验,处理 ManyToMany 关系是少数情况下摆脱 ORM 集成是我们头脑的最佳选择之一。特别是,当您使用双向导航时(即当关系和逆关系很有用时)。

@Gimby 在他的回答中是正确的,问题是复杂的交叉引用比做一个简单的本机查询要困难得多。

所以:

session.createSQLQuery("DELETE FROM imageviewer_imtype_variable").executeUpdate();

更容易,如果由于交叉引用而仍然无法正常工作,您甚至可以添加:

session.clear();

好的。这是另一个 ORM 集成侵权,但让你在两行中摆脱粪坑 ;-) 。

于 2014-12-02T11:05:00.303 回答
0

@Gimby 的答案是正确的,在多对多关系中,从彼此映射集合中删除相关实例会触发从关系映射表中删除。

于 2012-11-08T16:53:14.160 回答
0

在实体类 CRVariable 中添加:

@PreRemove
private void removeCRVariableFromCRImageType() {
    for (CRImageType crImageType: CRImageType) {
        crImageType.getCrvariables ().remove(this);
    }
}

此方法将覆盖 JPA 操作 PreRemove,以便从设置的 crvariables 中分离要删除的 CRVariable 对象(技术上是表 imageviewer_imtype_variable)

希望这对你有帮助!

于 2017-11-08T16:38:34.313 回答