2

目前我有一个使用 JpaRepository<Employee, EmployeePk> 的 Spring Boot 应用程序,假设 EmployeePk 是名字,姓氏。有没有办法通过主键字段删除而不必指定自定义@Query?如果多个人被命名为“John”,则可以删除多行。

例子:

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, EmployeePk> {

    @Transactional
    @Modifying
    @Query(value = "DELETE FROM Employee e WHERE e.EmployeePk.firstname = :firstname ")
    void deleteAllByEeId(String firstname);
}

void deleteByEmployeePkWhereFirstname(String firstname);

员工类和嵌入式 PK

public class Employee {

    @EmbeddedId
    private EmployeePK employeePK;
    
    private LocalDate birthDate;

}

public class EmployeePK implements Serializable {

    public static final long serialVersionUID = 1L;

    private String firstName;

    private String lastName;
}
4

2 回答 2

1

以下应该有效:

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, EmployeePk> {

    @Transactional
    @Modifying
    void deleteByEmployeePKFirstName(String firstname);
}

或者,如果您希望它更具可读性:

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, EmployeePk> {

    @Transactional
    @Modifying
    void deleteByEmployeePK_FirstName(String firstname);
}
于 2021-12-05T17:57:11.727 回答
1

感谢您添加 Employee 和 EmployeePK 代码源。

由于您的实体中有该字段firstName,因此您可以使用派生的删除查询,从而避免必须显式声明 JPQL 查询

基于spring数据文档

派生删除查询

Spring Data JPA 还支持派生删除查询,让您避免显式声明 JPQL 查询,如以下示例所示:

您可以在您的存储库中添加此方法。

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, EmployeePK> {

void deleteByEmployeePK_FirstName(String firstName);
}

您不需要@Modify注释,因为您不会使用@Query注释。

并添加@Entity到您的实体中,以便由数据库中的关联表进行映射。

@Entity
public class Employee {

@EmbeddedId
private EmployeePK employeePK;

private LocalDate birthDate;

 }
于 2021-12-05T21:22:56.390 回答