Hibernate HQL Update 语句中 WHERE 条件的正确写法

梦雪吖_7745

梦雪吖_7745

2026-04-12

994人浏览

原创

Hibernate HQL Update 语句中 WHERE 条件的正确写法

HQL 的 UPDATE 语句中,WHERE 子句不支持用英文逗号分隔多个条件,必须使用 AND(或 OR)逻辑连接符;否则会触发 QuerySyntaxException: expecting EOF, found ',' 错误。

hql 的 update 语句中,where 子句不支持用英文逗号分隔多个条件,必须使用 and(或 or)逻辑连接符;否则会触发 `querysyntaxexception: expecting eof, found ','` 错误。

在 Hibernate 的 HQL(Hibernate Query Language)中,UPDATE 语句的语法严格遵循类 SQL 的结构,但并非完全等同于原生 SQL。尤其需要注意:HQL 的 WHERE 子句中禁止使用逗号 , 分隔多个条件表达式——这与 SQL 中 WHERE a=1, b=2(非法)的语义一致,HQL 同样不支持该写法,而必须显式使用布尔逻辑运算符(如 AND / OR)。

你原始代码中的错误在于:

String query1 = "update hollywood set "
        + "name = :m_name ,"
        + "timing = :m_timing ,"
        + "price = :m_price "
        + "where name = :mname ,"      // ❌ 错误:逗号不能用于连接 WHERE 条件
        + "timing = :mtiming ,"
        + "price = :mprice";

HQL 解析器在遇到 where name = :mname , 后,期望语句结束(EOF),却意外发现逗号,因此抛出:

org.hibernate.hql.internal.ast.QuerySyntaxException: expecting EOF, found ','

✅ 正确写法是将逗号替换为 AND(注意前后空格,避免拼接后出现 = :mnameAND 等语法错误):

String hql = "UPDATE Hollywood SET "           // ✅ 使用实体类名(非表名!)
        + "name = :m_name, "
        + "timing = :m_timing, "
        + "price = :m_price "
        + "WHERE name = :mname AND "
        + "timing = :mtiming AND "
        + "price = :mprice";

Query query = session.createQuery(hql);
query.setParameter("m_name", m_name);
query.setParameter("m_timing", m_timing);
query.setParameter("m_price", m_price);
query.setParameter("mname", mname);
query.setParameter("mtiming", mtiming);
query.setParameter("mprice", mprice);

int updatedCount = query.executeUpdate(); // 返回受影响行数

⚠️ 关键注意事项:

  • 使用实体类名,而非数据库表名:HQL 面向对象,UPDATE Hollywood 中的 Hollywood 应为已映射的实体类(如 HollyWood.class),且需确保首字母大小写与类定义一致(推荐使用标准驼峰命名,如 Hollywood)。若实体类名为 HollyWood,则 HQL 中必须写 UPDATE HollyWood。
  • WHERE 条件必须基于实体属性:name、timing、price 必须是 HollyWood 实体的字段(或属性),且类型匹配。
  • 参数占位符安全无误:所有 :paramName 必须被 setParameter() 显式绑定,未绑定将导致 QueryParameterException。
  • 事务必需:DML 操作(UPDATE/INSERT/DELETE)必须在事务内执行,且需显式调用 transaction.commit()(你代码中缺失提交逻辑,仅 beginTransaction() 不够):
    Transaction tx = session.beginTransaction();
    try {
        int count = query.executeUpdate();
        tx.commit(); // ✅ 必须提交
        System.out.println("Updated " + count + " record(s)");
    } catch (Exception e) {
        tx.rollback(); // ✅ 出错回滚
        throw e;
    }
  • 慎用批量更新:HQL 批量 UPDATE 绕过一级/二级缓存,不会触发实体生命周期回调(如 @PreUpdate),也不加载实体到 Session。如需监听或验证,应改用 session.load() + 属性修改 + session.update() 方式。

? 补充建议:
为提升可维护性与类型安全,推荐使用 JPA 标准的 CriteriaUpdate(适用于复杂条件),或在简单场景下优先采用面向实体的变更方式(即查出对象 → 修改属性 → session.update()),以充分利用 Hibernate 的脏检查与缓存机制。

总之,牢记一条核心规则:HQL 的 WHERE 子句只接受布尔表达式,逗号不是逻辑连接符——请始终用 AND 或 OR。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

302

5

Hibernate框架介绍
Hibernate框架介绍

本专题整合了hibernate框架相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.06

2453

15

Java Hibernate框架
Java Hibernate框架

本专题聚焦 Java 主流 ORM 框架 Hibernate 的学习与应用,系统讲解对象关系映射、实体类与表映射、HQL 查询、事务管理、缓存机制与性能优化。通过电商平台、企业管理系统和博客项目等实战案例,帮助学员掌握 Hibernate 在持久层开发中的核心技能。

2025.09.02

7080

14

Hibernate框架搭建
Hibernate框架搭建

本专题整合了Hibernate框架用法,阅读专题下面的文章了解更多详细内容。

2025.10.14

738

8

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

2026.10.10

100

15

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

2026.10.10

40

15

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

2026.10.10

20

15

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

2026.10.10

40

26

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

2026.10.10

40

32

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习