有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在某些情况下忽略@SQLDelete注释

我想实现软删除,但仍然能够永久删除。有没有办法忽略声明的@SQLDelete()注释,或者说:

@SQLDelete("IF expression THEN UPDATE statement ELSE delete statement")

编辑:

这就是所讨论的实体

@Indexed
@Entity
@DynamicUpdate
@FilterDefs({
    @FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")}),
    @FilterDef(name = "deleteFilter")
})
@Filters({
    @Filter(name = "tenantFilter", condition = "tenant_id = :tenantId"),
    @Filter(name = "deleteFilter", condition = "deleted = false")
})
@SQLDelete(sql ="UPDATE Antwort SET deleted = true, date_modified = NOW() WHERE ID = ?; DELETE FROM Antwort WHERE deleted = true AND kundenentwurf_id IS NOT NULL", check = ResultCheckStyle.NONE)
public class Antwort implements TenantSupport, ISoftDeleteModel{

@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String tenantId;

@Column(nullable = false)
private Boolean deleted;
private Date dateModified;

@ManyToOne(fetch = FetchType.LAZY)
private Organisation organisation;

@ManyToOne(fetch = FetchType.LAZY)
private Projekt projekt;

@ManyToOne(fetch = FetchType.LAZY)
private Kundenentwurf kundenentwurf;

private Integer nummer;
private String frage;
private String antwort;


//getters, setters and contructors...

}

共 (1) 个答案

  1. # 1 楼答案

    我在我的Hibernate Tips中更详细地解释了这一点。以下是它的简短版本:

    EntityManager上调用remove方法时,Hibernate将执行@SQLDelete操作中定义的SQL语句

    无法停用@SQLDelete批注。因此,如果要从数据库中永久删除记录,则不能使用EntityManager的remove方法。您需要使用JPQL、Criterianative查询执行SQL DELETE语句

    以下是JPQL DELETE语句的示例:

    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    
    // do something ...
    
    // add this if you fetched the Book entity in this session
    em.flush();
    em.clear();
    
    Query query = em.createQuery("DELETE Book b WHERE id = :id");
    query.setParameter("id", 1L);
    query.executeUpdate();
    
    em.getTransaction().commit();
    em.close();
    

    如果获取了要在当前Hibernate会话中删除的Book实体,则需要在执行DELETE语句之前调用EntityManager上的flushclear方法。这确保在删除记录之前,所有挂起的更改都写入数据库