当前位置: 首页 > 知识库问答 >
问题:

Spring Data JDBC Querydsl:错误“JdbcRepository工厂不支持Querydsl”

壤驷睿
2023-03-14

我想使用具有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;

...

}

我的存储库类:

java prettyprint-override">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.不支持片段异常:存储库com.atende.db.metadata.jdbcrepository.ActionRepostory实现org.springframework.data.querydsl.QuerydslPredicateExec的,但JdbcRepositoryWorks不支持Querydsl!

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

当我在JdbcTemplate中直接使用QueryDSL时,它可以工作:

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),但得到了同样的错误。

共有2个答案

林英锐
2023-03-14

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

如果您在类路径上有Infobip-sping-data-jdbc-querydsl-boot-starter并删除@EnableJdbcRepositori它应该可以工作。QuerydslJdbcPredicateExec的是片段实现。

微生嘉祥
2023-03-14

这是对留档的曲解(不是你的错,它是以一种不幸的方式构造的)。

您正在查看前言,其中描述了使用 Spring 数据模块的一般方法。这并不表示手头的模块(在本例中为 JDBC)支持上述所有功能。

 类似资料:
  • 我创建了一个@RestController并映射了一个@PostMapping请求。 HTTP请求 模型类 我正在使用邮差作为其余的客户。 答复:

  • 所以我在这篇文章中发现了错误。我尝试升级gradle,但在使用不受支持的gradle版本时出现了另一个错误,因此我返回到4.4.2版本。 现在,我知道这是另一个问题的重复,但这个问题仍然存在,并且在较新版本的gradle和idea中尚未解决。此外,我不想使用包装。 我收到的错误: Gradle版本:4.4.2 IntelliJ IDEA版本:2018.3.5 您可以在这里找到一个测试项目来重现该问

  • 问题: 在我的应用程序中,我想通过cordova wkwebview访问图像。超文本标记语言元素如下所示。 加载时,我收到错误“加载资源失败:不支持的URL”。我正在使用iOS 10.2。 验证/尝试的事情: 如果选中文件夹“MyFolder”下的“cordova.file.dataDirectory”中存在的文件列表,我确实看到那里存在“file.jpg”。它的本机URL为文件:///var/m

  • 我试图制作我的第一个应用程序(hello world),并在手机上运行它,但当我单击run时,gradle返回了这个错误(我在这里研究了stackoverflow并试图关闭即时运行,但在我的情况下似乎不起作用): 后来编辑2:我想通了,我的电脑上安装了一个旧的jdk版本和最新的android studio,谢谢你的帮助。我只需要安装最新的jdk版本(8)

  • 我正在使用python向elasticsearch插入一些数据,elasticsearch版本是 从日期时间导入 日期时间 从 Elasticsearch 导入 Elasticsearch es = Elasticsearch( “localhost:9200” ) 从 Elasticsearch 导入 传输错误数据 = { “http_code” : “404”, “计数” : “10” } t

  • 我有一个方法来计算< code > div 中元素的数量并返回它们的数目。 这是页面源代码 WebDriver引发以下错误:不支持复合类名。考虑搜索一个类名并过滤结果,或者使用CSS选择器。 编辑: 结果是< code>WerbDriver不支持类名中的空格,omg。 你们能帮我在这种情况下使用< code>CSS选择器来找到元素吗?