JPA的联接查询中的“ where”条件无法正常工作本地查询

问题描述

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

父母:

@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;

}

孩子:

@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> {
      
}

在这里,我想要实现的是,我想获取所有活动的Child的Parent对象。但这会返回所有值,is_active = 1以及0。

解决方法

您只需要返回父级,而不是整个联接。就这样,您的查询返回了一个父级和子级连接在一起的集合。

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列表与必填字段一起获取,然后创建父级-child类似于代码中的结构。

一个建议,您应该在Java中以驼峰形式命名变量,即用controlId代替control_id,并使用@column(name='control_id'),但这是您的选择:)