"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')
但它是您的选择:)
我正在使用 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')
但它是您的选择:)