gpt4 book ai didi

java - JPQL从自引用表中删除

转载 作者:行者123 更新时间:2023-12-01 22:48:26 25 4
gpt4 key购买 nike

场景是我有一个类,它代表文件夹结构中的一个节点,该节点具有 ID、名称和指向其父级的链接。我正在尝试编写一些删除所有文件夹的代码,但是,如果文件夹未按照正确的顺序删除,则查询“从文件夹中删除”将不再起作用,因为完整性约束 - 即,如果文件夹有,则无法删除引用它的 child 。

因此需要首先删除没有子文件夹的文件夹,然后删除随后没有子文件夹的文件夹,以此类推,直到可以删除根文件夹。

我尝试编写一个循环来实现此效果,但我在查询中遇到困难,代码如下:

int rowsAffected = -1;

while(rowsAffected != 0) {
query = entityManager.createQuery(
"DELETE FROM MessageFolder mfparent"
+ "WHERE NOT EXISTS ("
+ "FROM MessageFolder mfchild"
+ "WHERE mfchild.parentId = mfparent.id"
+ ") ");
rowsAffected = query.executeUpdate();
}

我从中得到的错误是:

10:56:00,988 INFO [stdout](默认任务 9) Hibernate:从 PT_MESSAGE 中删除10:56:01,004 错误 [org.hibernate.hql.internal.ast.ErrorCounter] (默认任务 9)第 1:72 行:unexpec泰德 token :不10:56:01,004 错误 [org.hibernate.hql.internal.ast.ErrorCounter] (默认任务 9)第 1:72 行:unexpected 标记:NOT:第 1:72 行:意外标记:NOT 在 org.hibernate.hql.internal.antlr.HqlBaseParser.deleteStatement(HqlBaseParser.java:296) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]

我不太明白,因为“不存在”似乎作为 JPA 规范的一部分是有效的。我究竟做错了什么?另请注意,我的持久性提供程序是 Hibernate,因此如果我可以使用 JPA 或 Hibernate 以更好的方式做到这一点,那么这也是一种选择。

作为引用,MessageFolder 类位于此处:

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="PT_MESSAGE_FOLDER")
public class MessageFolder {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
private String name;

@OneToMany(mappedBy="messageFolder", targetEntity=Message.class,
cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private List<Message> messages;

@OneToOne
@JoinColumn(name="parentId", referencedColumnName="id")
private MessageFolder parentFolder;

public MessageFolder() {
messages = new ArrayList<>();
}

//getters.. setters...
}

最佳答案

您的主要问题是字符串连接,例如:

mfparent"
+ "WHERE

由于缺少空格字符,会产生无效语句

mfparentWHERE

我的建议是停止在 JPQL 中拆分字符串,因为它弊大于利。

关于java - JPQL从自引用表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25033898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com