如何解决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')
,但这是您的选择:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。