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

Spring Data JDBC集成Querydsl报JdbcRepositoryFactory不支持Querydsl

Spring Data JDBC 接入QueryDSL启动报错问题

问题背景

  • 目标:为Spring Data JDBC接入QueryDSL支持,参考官方说明操作后始终无法正常运行
  • 运行环境:MariaDB数据库,Spring Boot 2.6.0
  • 现有配置如下:
  1. pom.xml依赖配置
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency> 
    <groupId>com.querydsl</groupId> 
    <artifactId>querydsl-apt</artifactId>
</dependency>
<dependency> 
    <groupId>com.querydsl</groupId> 
    <artifactId>querydsl-sql-spring</artifactId>
</dependency>
  1. 数据层配置类
@Configuration
@EnableJdbcRepositories
@EnableTransactionManagement
public class DBConfig {

}
  1. 实体类定义
package com.test.model.metadata;

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;

@Table
public class Action {

    @Id
    private long id;

    private String name;

    // 其余属性、getter/setter省略
}
  1. Repository接口定义
package com.test.repository;

import java.util.List;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import com.test.model.Action;
import com.querydsl.core.types.Predicate;
        
@Repository
public interface ActionRepository extends PagingAndSortingRepository<Action, Long>, QuerydslPredicateExecutor<Action> {

    @Override
    List<Action> findAll(Predicate predicate);
}
  1. QueryDSL调用逻辑
QAction action = QAction.action;
Predicate predicate = action.name.like("%Accept%");
List<Action> actions = actionRepository.findAll(predicate);
  • 异常现象:
    • QueryDSL Q类可被注解处理器正常生成,项目编译无报错
    • 应用启动时抛出异常:org.springframework.data.repository.core.support.UnsupportedFragmentException: Repository com.atende.db.metadata.jdbcrepository.ActionRepository implements org.springframework.data.querydsl.QuerydslPredicateExecutor but JdbcRepositoryFactory does not support Querydsl!
    • 直接基于JdbcTemplate手动集成QueryDSL SQL可以正常运行,对应代码如下:
QAction action = QAction.action;
SQLTemplates dialect = new MySQLTemplates();
Connection connection = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());

SQLQuery<String> query = new SQLQuery<>(connection, dialect);
List<Tuple> actions = query.select(action.id, action.name)
        .from(action)
        .where(action.name.like("%Action%"))
        .fetch();
  • 尝试引入第三方QueryDSL封装类库后,仍抛出相同错误。

问题根因

这是版本不匹配导致的问题:Spring Data JDBC在2.x版本(对应Spring Boot 2.x全系列)并没有实现QuerydslPredicateExecutor对应的Repository片段,参考的官方文档是Spring Data JDBC 3.0及以上版本(对应Spring Boot 3.0+)的内容,2.6.0版本自带的JdbcRepositoryFactory本身就没有加载Querydsl相关的执行器实现,自然会抛出不支持的异常。
手动基于JdbcTemplate调用QueryDSL能正常运行,是因为这部分逻辑完全不依赖Spring Data JDBC的Repository封装,和Spring Data的Repository层集成无关。引入第三方类库仍报错,是因为引入的类库版本适配的是更高版本的Spring Boot,没有正确替换默认的Repository工厂实现。

解决方案

二选一即可:

  • 方案一(原生支持,推荐):将Spring Boot版本升级到3.0.0及以上,注意Spring Boot 3要求Java版本为17及以上,且javax包命名空间统一迁移为jakarta,需要同步适配项目中的其他依赖。升级后保留现有QueryDSL相关依赖即可,不需要额外编写配置类,Repository继承QuerydslPredicateExecutor就能直接使用QueryDSL谓词查询。
  • 方案二(保留Spring Boot 2.6.0版本):不要直接继承官方的QuerydslPredicateExecutor,该接口在Spring Boot 2.x场景下仅对Spring Data JPA提供实现,Spring Data JDBC没有对应支持。需要自定义Repository基类:
    1. 定义自定义基础Repository接口,声明需要的Querydsl查询方法,比如带Predicate参数的findAll
    2. 编写该基础接口的实现类,内部注入JdbcTemplate和对应数据库的SQLTemplates(MariaDB直接使用MySQLTemplates即可),复用之前手动集成QueryDSL SQL的逻辑实现查询
    3. 在@EnableJdbcRepositories注解上通过repositoryBaseClass属性指定自己编写的Repository实现类,所有业务Repository继承自定义的基础接口,即可获得QueryDSL查询能力
      如果要使用第三方QueryDSL封装类库,必须选择适配Spring Boot 2.6.x的版本,严格按照对应版本的文档完成配置,适配Spring Boot 3.x的版本在2.x环境下无法正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:33:16