"where" 条件在 JPA 中的连接查询(本机查询)中无法正常工作

"where" condition not working correctly in join query in JPA (native query)

我正在使用 Spring Boot Starter Web 与 MYSQL 和 JPA。我将实体创建为:

parent:

@Entity
@Table(name = "parent")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Parent{

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private Long id;

   @OneToMany(cascade = CascadeType.ALL)
   @JoinColumn(name = "control_id", referencedColumnName = "id")
   private List<Child> childList;

}

Child:

@Entity
@Table(name = "child")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Child{

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private Long id;
   private Long control_id;
   private Boolean is_active;

}

我有两个 DAO 作为

@EnableJpaRepositories
public interface ParentDao extends JpaRepository<Parent, Long> {
     @Query(value = "SELECT * FROM parent as p inner join child as c on p.id = c.control_id WHERE (c.is_active = 1 and p.id = :entry_id)", nativeQuery = true)
    Parent findActiveById(@Param("entry_id") Long aLong);
}

@EnableJpaRepositories
public interface ChildDao extends JpaRepository<Child, Long> {
      
}

这里我想要实现的是,我想获取 Parent 的 Object 以及所有处于活动状态的 Child。但这 returns 一切,is_active = 1 以及 0.

您只需要 return 父连接,而不是整个连接。实际上,您的查询 return 是父项和子项连接在一起的集合。

SELECT p FROM parent p inner join child c on p.id = c.control_id WHERE (c.is_active = 1 and p.id = :entry_id)

您已经有子存储库,您可以使用它来获取子存储库

@EnableJpaRepositories
public interface ChildDao extends JpaRepository<Child, Long> {
      // Method in this manner will be automatically converted into a query
      List<Child> findByControl_idAndIs_active(Long control_id, Boolean is_active);
}

// Use it like this
List<Child> children = childDao.findByControl_idAndIs_active(control_id, true); 

// Then fetch the Parent separately or can fetch before also
Optional<Parent> parent = parentDao.findById(parent_id);

如果您想知道这些方法的来源,请See This

但是,如果您想在一个查询中将父项和子项都作为相同的结构获取,那么这是不可能的,您可以做的一件事是使用自定义查询将其获取到具有必填字段的 Dto 列表中,然后在您的代码中创建 parent-child 类结构。

一个建议,您应该在 java 中以驼峰命名法命名变量,即 controlId 而不是 control_id 并使用 @column(name='control_id') 但它是您的选择:)