[英]Java JpaRepository @Query join own table
我有一个实体类,其中每个实例可以具有相同类型的父代。
现在,我希望能够删除父对象,并在此过程中删除其所有子对象。 我无法通过级联类型执行此操作,因此我在JPA存储库中进行了自定义查询。 不幸的是,由于自定义查询存在某种错误,因此无法创建该bean。
实体类
@Entity
@Transactional
@Table(name = "bericht")
@Proxy(lazy = false)
@Embeddable
public class Bericht implements Serializable {
@Id
@GeneratedValue
private Integer id;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.DETACH)
@JoinColumn(name = "PARENT_ID")
private Bericht parent;
}
仓库接口
@Transactional
public interface BerichtRepository extends JpaRepository<Bericht, Integer> {
@Query("SELECT b1 FROM Bericht b join Bericht b1 WHERE b1.parent.id <> NULL AND b1.parent.id = b.id AND b.id = ?1 order by b1.id desc")
public List<Bericht> getChildrenVanBericht(Integer id);
public default void deleteBericht(Integer id) {
List<Bericht> kinderen = getChildrenVanBericht(id);
for(Bericht kind:kinderen) {
if(getChildrenVanBericht(kind.getId()).size()==0) {
this.delete(kind);
} else {
deleteBericht(kind.getId());
}
}
}
}
如所见,我想通过deleteBericht
方法从层次结构的底部开始删除,并在层次结构中向上移动至顶部。
有没有比上面显示的deleteBericht
方法更好的解决方案?
首先,尝试避免递归,这总是有风险的。
我kind.id
给您另一个解决方案,获取所有kind.id
的列表,然后进行SQL删除,例如Query s = entytiManager.createQuery("Delete * From KindTable k Where k.id In ( :kIdLst )");
并通过q.setList("kIdLst", kindIds);
提供kIdLst q.setList("kIdLst", kindIds);
祝好运 ! ž
首先,您的基本映射存在一些问题。 如果是实体,则不应具有@Embeddable
批注。 另外,您不应该在@Entity
上使用@Transactional
。
无论如何,我希望如果要使双向关系如下所示,则应该能够以正常方式删除:
@Entity
@Table(name = "bericht")
@Proxy(lazy = false)
public class Bericht implements Serializable {
@OneToOne(mappedBy = "parent", cascade = CascadeType.DELETE)
private Bericht child;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.DETACH)
@JoinColumn(name = "PARENT_ID")
private Bericht parent;
//additionally always ensure both sides of the relationship are consistent
public void setChild(Bericht child){
this.child = child;
child.parent = this;
}
public void setParent(Bericht parent){
this.parent = parent;
parent.child = this;
}
}
现在,在删除Bericht实例时,应自动删除所有子级。
Bericht b = //some Bericht
berichtRepository.delete(b);// should cascade down through all children
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.