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会生成分页包装查询,可能丢失原始查询的提示。可以:- 临时移除
Pageable参数测试提示是否正常填充; - 开启
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
相关产品推荐
相关产品推荐

