如何在HibernateJava中使用@EmbeddedId执行软删除?

如何在HibernateJava中使用@EmbeddedId执行软删除?,hibernate,jpa,spring-data-jpa,Hibernate,Jpa,Spring Data Jpa,我无法使用@EmbeddedId执行软删除? 未执行@SQLDelete中的sql @Data @EqualsAndHashCode(exclude = "serviceEmployeeIdentity", callSuper = true) @Entity @Audited @Table(name = "service_employee") @SQLDelete(sql = "UPDATE service_employee " + "SET deleted = true " +

我无法使用@EmbeddedId执行软删除? 未执行@SQLDelete中的sql

@Data
@EqualsAndHashCode(exclude = "serviceEmployeeIdentity", callSuper = true)
@Entity
@Audited
@Table(name = "service_employee")
@SQLDelete(sql = "UPDATE service_employee " +
    "SET deleted = true " +
    "WHERE service_employee.service_id = ?1 " +
    "AND service_employee.employee_b_number = ?2")
@Where(clause = "deleted = false")
public class ServiceEmployee extends Auditable implements Serializable {

    @EmbeddedId
    private ServiceEmployeeIdentity serviceEmployeeIdentity;

    @Column(name = "critical")
    private Boolean critical;

    @Column(name = "critical_rationale")
    private String criticalRationale;
}

@Repository
public interface ServiceEmployeeRepository extends 
JpaRepository<ServiceEmployee, ServiceEmployeeIdentity> {}

// test
ServiceEmployee serviceEmployee = ServiceEmployeeBuilder.aServiceEmployee();
serviceEmployeeService.deleteById(
    serviceEmployee.getServiceEmployeeIdentity());
我试图对两个id的值进行硬编码,以构成嵌入的id

我可以在只使用@Id而不使用@Id的实体上实现软删除 @嵌入ID

当我对仅使用@Id的实体运行带有delete的测试时,我可以看到正在控制台上执行的sql,但不使用@EmbeddedId

我认为它只是绕过了@SQLDelete,使用了hibernate中的默认deletesql。 我希望@SQLDelete中的sql正在执行

@Data
@EqualsAndHashCode(exclude = "serviceEmployeeIdentity", callSuper = true)
@Entity
@Audited
@Table(name = "service_employee")
@SQLDelete(sql = "UPDATE service_employee " +
    "SET deleted = true " +
    "WHERE service_employee.service_id = ?1 " +
    "AND service_employee.employee_b_number = ?2")
@Where(clause = "deleted = false")
public class ServiceEmployee extends Auditable implements Serializable {

    @EmbeddedId
    private ServiceEmployeeIdentity serviceEmployeeIdentity;

    @Column(name = "critical")
    private Boolean critical;

    @Column(name = "critical_rationale")
    private String criticalRationale;
}

@Repository
public interface ServiceEmployeeRepository extends 
JpaRepository<ServiceEmployee, ServiceEmployeeIdentity> {}

// test
ServiceEmployee serviceEmployee = ServiceEmployeeBuilder.aServiceEmployee();
serviceEmployeeService.deleteById(
    serviceEmployee.getServiceEmployeeIdentity());
@数据
@EqualsAndHashCode(exclude=“serviceEmployeeIdentity”,callSuper=true)
@实体
@审计
@表(name=“服务\员工”)
@SQLDelete(sql=“更新服务\员工”+
“SET deleted=true”+
“其中service_employee.service_id=?1”+
“和服务员工。员工编号=?2”)
@其中(子句=“已删除=错误”)
公共类ServiceEmployee扩展可审核的实现可序列化{
@嵌入ID
私人服务雇员身份服务雇员身份;
@列(name=“critical”)
私有布尔临界;
@列(name=“critical_-rational”)
私有字符串临界原理;
}
@存储库
公共接口服务EmployeeRepository扩展
JpaRepository{}
//试验
ServiceEmployee=ServiceEmployeeBuilder.asServiceEmployee();
serviceEmployeeService.deleteById(
getServiceEmployeeIdentity());
注: serviceEmployee已设置embeddedId
serviceEmployeeService只调用repository类

,这就像它是一个单值
@Id
注释列一样。您只需按照它们在嵌入式类中的表示顺序指定多个列,因此在
@SQLDelete
中使用它:

UPDATE service_employee
   SET deleted = true
 WHERE service_id = ?
   AND employee_b_number = ?

我试着为我工作,但顺序是embeddedId列的字母顺序

@SQLDelete(sql = "UPDATE (table_name) SET DELETED=true WHERE event_id = ? and payment_id=?")
如果我使用

@SQLDelete(sql = "UPDATE (table_name) SET DELETED=true WHERE payment_id = ? and event_id=?")

它将不起作用,也不会更新所需的注册表。

谢谢您的回复。我试着只使用服务id和员工编号,而不是添加服务员工。在它前面。问题仍然存在。不过,我尝试在repository类中使用本机sql创建自定义“@Query”。查询已执行,但我遇到了“toString”异常。然后,我添加了“@ToString”注释,并在ServiceEmployee类上排除serviceEmployeeIdentity,还在测试中添加了entityManager.flush。我能够看到“@SQLDelete”中的sql被执行,删除标志被更新。