JPA JPQL - 如果不使用子对象(没有主键/外键关系)并且可以删除,则返回的查询

Posted

技术标签:

【中文标题】JPA JPQL - 如果不使用子对象(没有主键/外键关系)并且可以删除,则返回的查询【英文标题】:JPA JPQL - Query that returns if child object is not used (no primary key / foreign key relationship) and can be deleted 【发布时间】:2021-03-24 19:07:54 【问题描述】:

Spring Boot / mysql / JPA / JPQL

我有一个应用允许删除一个对象,只要它不被另一个对象引用(主键/外键关系)

对于 UI,如果没有参照完整性问题/约束,我只想显示删除按钮(这意味着如果存在 pk/fk 关系,我不想显示删除按钮)。

假设我的子对象是 BookCategory,父对象是 Book。如果将 BookCategory 分配给 Book,则不显示删除按钮,如果没有关系,则显示按钮。

显然,在我的情况下,BookCategory 对象模型没有对 Book 的引用,我可以这样做......但这似乎有点浪费资源,但如果我延迟加载它可能不会。

我正在尝试通过 jpa / @query 等找到一种方法,以允许 UI 知道是否显示删除按钮。

我在给定页面上的 BookCategory(s) 中循环,但当然就像我说的那样,它不知道它是否分配给一本书。

似乎这件事需要一直做,但不确定如何最好地构建它。

谢谢,基思

【问题讨论】:

【参考方案1】:

假设您在实体之间有多对多的连接。

在您的示例中,您可以使用与图书的惰性连接并创建实体图以在必要时加载它,或者使用 jpql 和 join fetch。

你必须检查是否有连接的对象,所以你也可以写一个jpql来计算连接的对象。

使用 Spring Data JPA,您可以创建一个复合模型,例如 id 列表、计数...字段引用书籍并将其他必要字段放入书籍类别。然后 spring data 可以将它加载到模型中:

@Query(" select new com.mypackage.CustomBookCategory(b.name,count(b.book), ...) from BookCategory b where ...")
List<CustomBookCategory> findByCategory(String category);

【讨论】:

以上是关于JPA JPQL - 如果不使用子对象(没有主键/外键关系)并且可以删除,则返回的查询的主要内容,如果未能解决你的问题,请参考以下文章

无法在 FROM 子句中使用子查询编写 JPQL 查询 - Spring Data Jpa - Hibernate

无法在 FROM 子句中使用子查询编写 JPQL 查询 - Spring Data Jpa - Hibernate

JPA JPQL 怎么判断某个字段是不是为空

JPQL 的 Spring Boot JPA“查询验证失败”错误

JPA学习(JPA_JPQL)

没有 JPQL 查询的 Spring-data-jpa 中的 CURRENT_DATE