【问题标题】:Delete from a JPARepository with an EmbeddedId by a field in the primary key通过主键中的字段从具有 EmbeddedId 的 JPARepository 中删除
【发布时间】:2022-01-10 05:07:53
【问题描述】:

目前我有一个使用 JpaRepository 的 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;
}

【问题讨论】:

  • 你能贴出实体 Employee 和类 EmployyPk 的代码吗?实际上,您可以使用JpaRepository 定义的基于实体字段的方法来按名字删除员工
  • 已发布。是的,我正在寻找您提到的类似内容,但在涉及 EmbeddedId 时找不到文档。

标签: java spring-data-jpa crud-repository


【解决方案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);
}

【讨论】:

  • 有效。谢谢!
  • 如果我的回答帮助您考虑支持它甚至接受它作为答案,以便它可以“关闭”并且其他人可以从中受益并轻松理解这可能是类似问题的可能解决方案; ) 谢谢!
  • 哦,你已经接受了另一个答案。没关系,但至少考虑支持我的。谢谢!
  • 绝对!我刚刚创建了这个帐户,终于获得了足够的积分来支持其他用户。也希望我能接受这两种解决方案。
  • 谢谢@Bizzaroerik!
【解决方案2】:

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

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

基于spring data documentation

派生删除查询

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;

 }

【讨论】:

  • 那行得通。谢谢阿贝纳莫!
  • 太好了 :) 你能接受它作为对你帖子的回应吗 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多