当前位置: 首页 > 知识库问答 >
问题:

JPQL使用Join更新声明

牧甫
2023-03-14

我以前从未使用过JPQL,我需要用它来批量更新特定列中的值。该列存在于表中,但实体类是在没有变量的情况下设置的。我不能使用确切的数据,但设置会像这样给你一个想法:

数据库列

Books:
book_id book_title author_id

Authors:
author_id first_name last_name

JPA 实体类

Books:
private Integer bookId;
private String bookTitle;
private EAuthor author;

Authors:
private Integer authorId;
private String firstName;
private String lastName;

在 Books 实体类中,有一个 getter

String queryUpdate = "UPDATE books b SET b.book_title = :bookTitle"
                            + " WHERE b.author = :authorId";

String queryUpdate = "UPDATE books b SET b.book_title = :bookTitle"
                            + " WHERE b.author.authorId = :authorId";

这两个问题都是b.作者提出的。authorId和b.author是无效的标识符。是否可以编写两个单独的查询?1个查询作为select语句,我可以使用连接,然后使用第二个查询来更新第一个查询的结果集?

共有1个答案

酆恩
2023-03-14

JPQL对于这项工作来说是一个糟糕的选择<代码>b.作者。不允许使用authorId,因为它会转换为SQL联接。JPQL也不支持<code>UPDATE<code>语句中的子查询。您可以将author_id映射到书籍中的属性

@Column(name = "author_id", insertable=false, updatable=false)
private Long authorId;

有了上面的方法,你可以做:

UPDATE Books b SET b.book_title = :bookTitle WHERE b.authorId = :authorId

但是,您必须适应更改域模型以适应带有UPDATE查询的单个案例。

您应该能够将任务拆分为两个查询,如下所示:

List<Long> ids = em.createQuery("SELECT b.id FROM Books b WHERE b.author.id = :authorId", Long.class)
    .setParameter("authorId", authorId)
    .getResultList();
em.createQuery("UPDATE Books b SET b.bookTitle = :bookTitle WHERE b.id IN :ids")
    .setParameter("ids", ids)
    .setParameter("bookTitle", bookTitle)
    .executeUpdate();

或者,您可以简单地从代码中更新实体:

em.createQuery("SELECT b.id FROM Books b WHERE b.author.id = :authorId", Book.class)
    .setParameter("authorId", authorId)
    .getResultList()
    .forEach(book -> book.setBookTitle(bookTitle));
 类似资料:
  • 问题内容: 使用Hibernate,我想根据条件更新数据库中的数据,但是出现以下错误:“遍历的节点不能为空” 这是我的数据库描述: 这是我的JPA: 我究竟做错了什么?如果我将LEFT JOIN移到SET之前: 我得到:“正在期待SET,找到了LEFT” 如果我删除联接: 我得到:“非法尝试取消对集合的引用”。 更新值的正确方法是什么? 谢谢你的帮助! 问题答案: 第4章中的JPA 2.0规范包含

  • 我有两个表,喜欢用另一个表的值更新其中一个表。 我已经尝试过这些查询,但SQLite不支持使用UPDATE进行连接。任何人都可以提出查询。谢谢您的帮助。

  • 我正在尝试使用内部联接更新表。我试图做的是获取具有“code”值的“username”,并在另一个表上更新该“username”的值。 我试过这个: 这给了我“致命错误:调用非对象上的成员函数bind_param()” 我搜索并找到了一些像我这样的问题,但我不能解决这个问题。我使用了,它给出了布尔值false,但是我看不出问题在哪里。

  • 我正在尝试更新表,下面是我正在使用的查询 我还尝试了另一个查询: 测试了运行良好的select查询,不确定问题是什么,在IBMDB2中是否有所不同。

  • 问题内容: 我是SQLAlchemy新手。 假设我在声明模式下有一个用户表: 当我知道没有将对象加载到会话中的用户ID时,我会像这样更新该用户: 我不喜欢使用,我应该不再为此担心吗? 有一个更好的方法吗? 谢谢! 问题答案: 在ORM级别上也有一些更新功能。它还不能处理任何棘手的情况,但是对于单行更新(或批量更新)的普通情况,它可以正常工作。它甚至会遍历所有已加载的对象,并将更新应用于它们。您可以

  • 问题内容: 我有两个表,并且想为LEFT JOIN中的所有行更新T1中的字段。 举一个简单的例子,更新以下结果集的所有行: 在MySQL手册指出: 多表UPDATE语句可以使用SELECT语句中允许的任何类型的联接,例如LEFT JOIN。 但是我在记录的多表UPDATE中找不到执行此操作的正确语法。 正确的语法是什么? 问题答案: 请注意,使用/ 语法会更有效: 有关性能的详细信息,请参见我的博