Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在某些情况下如何忽略@SQLDelete注释_Java_Hibernate_Annotations_Sql Delete_Soft Delete - Fatal编程技术网

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

Java 在某些情况下如何忽略@SQLDelete注释,java,hibernate,annotations,sql-delete,soft-delete,Java,Hibernate,Annotations,Sql Delete,Soft Delete,我想实现软删除,但仍然能够永久删除。有没有办法忽略声明的@SQLDelete()注释,或者说: @SQLDelete("IF expression THEN UPDATE statement ELSE delete statement") 编辑: 这就是所讨论的实体 @Indexed @Entity @DynamicUpdate @FilterDefs({ @FilterDef(name = "tenantFilter", parameters = {@ParamDef(name =

我想实现软删除,但仍然能够永久删除。有没有办法忽略声明的@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...

}

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

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

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

以下是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会话中删除的
书籍
实体,则在执行DELETE语句之前,需要在
实体管理器
上调用
刷新
清除
方法。这可以确保在删除记录之前将所有挂起的更改写入数据库。

我的想法是在数据库站点上编写过程,它将调用逻辑操作,因为此查询是本机的,并且没有问题solution@PiotrRogowski六羟甲基三聚氰胺六甲醚。。我不希望直接在数据库中写入任何内容,因为在部署时,这将是我需要考虑的另一个步骤。这可以通过纯hibernate完成吗?Thx,我可能会以这种方式结束,但是否可以在@SQLDelete()注释中执行2条语句。我有一个实体“Book”,我想软删除,除非设置了外来的“author\u id”,然后我想硬删除。我认为可以说
@SQLDelete(sql=“updatebook SET deleted=true,其中ID=?;DELETE FROM Book WHERE deleted=true,author_ID不为NULL”)
。但这似乎不起作用。有可能做到这一点吗?这应该是可能的。您是否收到任何错误消息?我尝试了这个映射,它工作了:
@SQLDelete(sql=“updatebook SET status='DELETED'其中id=?和version=?;DELETE FROM book其中status='DELETED'并且title为NULL”,check=ResultCheckStyle.NONE)
我得到:sql错误:1064,SQLState:42000。但是如果我通过MySQL workbench执行SQL,那么它可以正常工作。我的实际代码是
@SQLDelete(SQL=“UPDATE Antwort SET deleted=true,date\u modified=NOW(),其中ID=?;DELETE FROM Antwort WHERE deleted=true,kundentwurf\u ID不为NULL”,check=ResultCheckStyle.NONE)
请发布你的Antwort实体