在MariaDB上使用Hibernate进行JPQL更新查询时出错

ryhaxcpt  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(250)

"你好"
我正在尝试使用Hibernate更新MariaDB数据库表中的一行。如下所示:

public static void updateJPQL() {
        EntityManager entmngr = JPAProvider.getEntityManager();
        EntityTransaction transaction = entmngr.getTransaction();
        transaction.begin();
        Query query = entmngr.createQuery("UPDATE users o set o.name = 'John' where o.id =: NID");
        query.setParameter("NID", 2L);

        query.executeUpdate();

        transaction.commit();
        entmngr.close();
    }

Hibernate会产生此错误:

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.sql.ast.SqlTreeCreationException: Could not locate TableGroup - NavigablePath[model.entity.Users(o)]

其他查询会执行得很好。我可以插入到我的表中,我可以提取所有的记录,但这个更新查询是个问题。

3npbholx

3npbholx1#

需要检查并注意以下几点:

  • UPDATE查询中使用的表名应该是Map的Java类名,而不是数据库表名,并且区分大小写。那么查询中的users是否是表名,因为我们很少用小写字母开头的Java类命名?如果是,请将其更改为Map的Java类名。(同样的方法也适用于列,使用java对象字段名而不是实际的表列名引用它们)
  • 使用ORM的要点是我们不想手工编写SQL语句来更新数据库记录,我们想把数据库记录作为一个对象来处理,JPA将自动生成SQL来更新相应的DB记录,而不是自己编写。因此,使用JPA更新记录的正确方法是获取要更新的记录,更改其状态:
User user = entmngr.find(User.class, 2L);
user.setName("John")
b5lpy0ml

b5lpy0ml2#

这段代码也有同样的问题,db是postgresql:

@Modifying
@Query("DELETE FROM Account a WHERE a.id = :id AND a.user.id = :userId")
int delete(@Param("id") int id, @Param("userId") int userId);

我使用了依赖关系

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>6.0.0.Alpha5</version>
    <type>pom</type>
</dependency>

仅更改为以下依赖关系后,所有工作正常:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.15.Final</version>
</dependency>

也许是新版本中的一个bug,或者也许我们需要一些关于Hibernate 6.0.0.Alpha5 + Spring Data JPA 2.3.0.RELEASE的魔法。我没有找到任何信息。如果你知道一些关于这方面的信息,让我知道。

相关问题