【问题标题】:Using "SQL_NO_CACHE" statement in HQL from Hibernate在 Hibernate 的 HQL 中使用“SQL_NO_CACHE”语句
【发布时间】:2026-01-27 23:25:02
【问题描述】:

我正在使用 hibernate 4.x 并希望在 HQL 查询中设置来自 MySQL 的“SQL_NO_CACHE”语句

@Query("FROM mytable t WHERE id=1");

目前生产

select * from mytable where id=1

但我想要

select SQL_NO_CACHE * from mytable where id=1

但我不知道怎么做。

使用本机查询没有问题,但是所有查询都是用 HQL 编写的,并且比这个示例复杂得多。所以我得到了一个QuerySyntaxException: unexpected token 异常,因为这个语句无论如何都没有记录在休眠文档中。

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch16.html

【问题讨论】:

  • 嗯,Hibernate 支持每个 RDBMS 特定语句显然是不现实的,因此 Native SQL 将是这里唯一的选择。
  • 当然,但我什至没有找到文档化的方法来扩展 HqlParser 以自行添加
  • 更进一步,也许您实际上可以通过自定义方言来做到这一点。请参阅此处的示例:keyurj.blogspot.co.uk/2012/12/…

标签: mysql hibernate hql


【解决方案1】:

可以创建一个包含 SQL_NO_CACHE 子句的视图。然后,当休眠运行 SQL 查询时,您可以覆盖 PhysicalNamingStrategyStandardImpl.toPhysicalTableName 并更改以获取视图名称而不是表名称。例如,默认名称为“mytable”,您的视图名称为“vw_mytable”,然后在命名您的表之前连接“vw_”。

将此实现从 PhysicalNamingStrategyStandardImpl 放入属性“hibernate.physical_naming_strategy”的持久性文件中,您的查询将使用子句 SQL_NO_CACHE。

【讨论】:

    【解决方案2】:

    使用 StatementInspector 更改生成的 SELECT 语句。使用方法见related question

    【讨论】: