Spring Data JPA 2.7.8中能否用SpEL在@QueryHint读取配置参数?
问题解答
结论
Spring Data JPA 2.7.8 不支持直接在@QueryHint的value属性中使用SpEL表达式。@QueryHint注解的value会被Spring当作字面量处理,你写的#{environment.getProperty('myapp.custom-batch-size.student-query')}不会被解析为配置文件中的数值,而是直接作为字符串传入JPA provider,导致配置失效。
替代方案
1. 自定义Repository实现(推荐)
通过手动实现Repository方法,在代码中动态从配置读取fetch size并设置查询提示,步骤如下:
首先定义基础Repository接口:
import org.springframework.data.jpa.repository.JpaRepository; import java.util.stream.Stream; public interface StudentRepository extends JpaRepository<Student, Long>, StudentRepositoryCustom { }
然后定义自定义方法的接口:
import java.util.stream.Stream; public interface StudentRepositoryCustom { Stream<Student> findByName(String name); }
最后实现自定义接口,注入EntityManager和Environment来动态获取配置:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.data.jpa.repository.query.QueryHints; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import java.util.stream.Stream; @Repository public class StudentRepositoryImpl implements StudentRepositoryCustom { private final EntityManager entityManager; private final Environment environment; @Autowired public StudentRepositoryImpl(EntityManager entityManager, Environment environment) { this.entityManager = entityManager; this.environment = environment; } @Override public Stream<Student> findByName(String name) { // 从application.yml中读取自定义批次大小,可设置默认值 Integer fetchSize = environment.getProperty( "myapp.custom-batch-size.student-query", Integer.class, 1000 ); TypedQuery<Student> query = entityManager.createQuery( "SELECT s FROM Student s WHERE s.name = :name", Student.class ).setParameter("name", name); // 设置查询提示 query.setHint(QueryHints.HINT_FETCH_SIZE, fetchSize); query.setHint(QueryHints.HINT_READONLY, true); query.setHint(QueryHints.HINT_PASS_DISTINCT_THROUGH, false); return query.getResultStream(); } }
2. 全局配置(适合统一设置所有查询的fetch size)
如果不需要针对单个查询自定义,可在application.yml中全局配置JPA的fetch size:
spring: jpa: properties: hibernate: jdbc: fetch_size: ${myapp.custom-batch-size.global}
说明
Spring Data JPA的@QueryHint注解设计初衷是接受静态值,即使后续更高版本(如Spring Data JPA 3.x)也未原生支持SpEL解析。自定义Repository实现是当前版本下最灵活可靠的解决方案。
内容的提问来源于stack exchange,提问作者Wafa
相关产品推荐
相关产品推荐

