You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+Hibernate中@QueryHints无法注入至Query问题求助

问题:@QueryHints无法在Hibernate的QueryParameters中填充查询提示

我正在使用Spring Boot(2.7.18)、Hibernate(5.6.15)和JPA实现一个简单的仓库。在某个查询方法上添加了@QueryHints注解,但调试自定义Dialect的addSqlHintOrComment方法时,发现QueryParameters中的查询提示始终为空,无论使用命名查询还是移除@Query注解都无法解决。

仓库代码示例:

@Query(value = """
           SELECT DISTINCT(a.announcerName)
           FROM Announces a
           WHERE 
           (a.announcerName LIKE :prefix%)""")
@QueryHints({@QueryHint(name = "name", value = "value")})
@NonNull List<String> findAnnouncersNamesByFilter(@NonNull @Param("prefix") final String prefix, @NonNull final Pageable page);

自定义Dialect代码:

public String addSqlHintOrComment(
        String sql,
        QueryParameters parameters,
        boolean commentsEnabled) {

   return super.addSqlHintOrComment(sql, parameters, commentsEnabled);
}

解决方案
  • 使用Hibernate原生查询提示前缀:
    JPA的@QueryHint需要使用Hibernate特定的提示名称前缀org.hibernate.query.hints.(或直接使用Hibernate内置的提示名,如org.hibernate.comment),自定义名称不会被Hibernate识别并填充到QueryParameters中。修改注解示例:

    @QueryHints({@QueryHint(name = "org.hibernate.comment", value = "custom-hint-content")})
    
  • 处理Pageable导致的提示丢失:
    当方法包含Pageable参数时,Spring Data JPA会生成分页包装查询,可能丢失原始查询的提示。可以:

    1. 临时移除Pageable参数测试提示是否正常填充;
    2. 开启forCounting属性,确保分页计数查询也携带提示:
      @QueryHints(value = {
          @QueryHint(name = "org.hibernate.comment", value = "custom-hint-content")
      }, forCounting = true)
      
  • 绕过Spring Data JPA,直接用EntityManager设置提示:
    如果注解方式始终不生效,可直接通过EntityManager创建查询并手动设置提示:

    @Autowired
    private EntityManager entityManager;
    
    public List<String> findAnnouncersNamesByFilter(String prefix, Pageable page) {
        Query query = entityManager.createQuery("""
                SELECT DISTINCT(a.announcerName)
                FROM Announces a
                WHERE (a.announcerName LIKE :prefix%)""")
                .setParameter("prefix", prefix)
                .setHint("org.hibernate.comment", "custom-hint-content")
                .setFirstResult((int) page.getOffset())
                .setMaxResults(page.getPageSize());
        return query.getResultList();
    }
    
  • 确认自定义Dialect注册正确:
    确保自定义Dialect已配置到Spring Boot中,在application.properties添加:

    spring.jpa.properties.hibernate.dialect=com.your.package.YourCustomDialect
    

内容的提问来源于stack exchange,提问作者Rafael Lima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:31:10