【问题标题】:Spring Data JDBC + Querydsl: error "JdbcRepositoryFactory does not support Querydsl"Spring Data JDBC + Querydsl:错误“JdbcRepositoryFactory 不支持 Querydsl”
【发布时间】:2022-08-10 14:28:27
【问题描述】:

我想使用带有 QueryDSL 支持的 Spring Data JDBC。根据 Spring 文档 (https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#core.extensions.querydsl),它受支持,但我无法使其工作。

我使用 MariaDB 作为数据库,我的 SpringBoot 版本是 2.6.0。

我在 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>

配置:

@Configuration
@EnableJdbcRepositories
@EnableTransactionManagement
public class DBConfig {

}

我的实体类:

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;

...

}

我的存储库类:

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);
}

QueryDSL谓词用法:

QAction action = QAction.action;
Predicate predicate = action.name.like(\"%Accept%\");
List<Action> actions = actionRepository.findAll(predicate);

Q 类由预处理器正确生成,编译成功,但在应用程序启动期间出现错误:org.springframework.data.repository.core.support.UnsupportedFragmentException: Repository com.atende.db.metadata.jdbcrepository.ActionRepository 实现了 org.springframework.data.querydsl.QuerydslPredicateExecutor 但 JdbcRepositoryFactory 不支持 Querydsl!

我的解决方案中还缺少什么?

当我直接将 QueryDSL 与 JdbcTemplate 一起使用时,它可以工作:

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();

我也尝试使用 infobip querydsl 库 (https://github.com/infobip/infobip-spring-data-querydsl) 但得到了同样的错误。

    标签: spring-boot jdbc spring-data querydsl spring-data-jdbc


    【解决方案1】:

    这是对文档的误解(不是您的错,它的结构很不幸)。

    您正在查看描述使用 Spring Data 模块的一般方法的前言。 这并不表示手头的模块(在本例中为 JDBC)支持所有提到的特性。

    【讨论】:

    • 所以你的意思是Spring Data JDBC不支持QueryDSL?也许文档不清楚,但从我的角度来看,似乎有些人使用了这个功能。例如。提到的 QueryDSL 库 (github.com/infobip/infobip-spring-data-querydsl) 具有 Spring Data JDBC 模块 - 使用尚不支持的东西会很奇怪
    【解决方案2】:

    Spring Data JDBC 不提供 Querydsl 支持。 这意味着激活spring-data-jdbc 存储库实现的@EnableJdbcRepositories 不提供Querydsl 支持。

    如果您在类路径上有 infobip-spring-data-jdbc-querydsl-boot-starter 并删除 @EnableJdbcRepositories 它应该可以工作。 QuerydslJdbcPredicateExecutor 是片段实现。

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 2012-11-09
      • 2018-04-06
      • 2013-03-29
      • 2020-09-30
      • 2021-01-23
      • 1970-01-01
      • 2016-01-08
      • 2016-12-26
      相关资源
      最近更新 更多