Spring Boot 1.4 QueryDSL 依赖问题

Posted

技术标签:

【中文标题】Spring Boot 1.4 QueryDSL 依赖问题【英文标题】:Spring Boot 1.4 QueryDSL dependencies issue 【发布时间】:2016-12-12 09:13:34 【问题描述】:

我刚刚从 Spring Boot 1.3.6 更新到 1.4.0,我遇到了下一个问题:

无法解析com.querydsl.jpa.JPQLQuery 类型。它是从所需的 .class 文件中间接引用的

我的 pom.xml 配置是:

    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
...

    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>3.7.4</version>
    </dependency>

     <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-sql</artifactId>
        <version>4.1.3</version>
    </dependency>

有什么线索吗?

谢谢。

【问题讨论】:

您尝试混合使用 QueryDSL 版本(3.7.4 和 4.1.3)有什么原因吗?您应该全面使用 4.x 它们是两个不同的组 com.mysema.querydsl 和 com.querydsl 并用于两个不同的模块。但是即使从我的项目中删除 com.querydsl (4.1.3) 仍然会发生错误。发生错误的类有这个import "import com.mysema.query.jpa.JPQLQuery" 它们在两个不同的模块中使用,但您没有在问题中提到这一点,而是在同一个 pom 中显示了它们?请停止浪费人们的时间,并提供一个重现问题的最小、准确的示例 对不起,我不认为我说清楚了。两个工件都在同一个 pom.xml 中。该配置在 Spring Boot 1.3.6 中运行良好,但在 Spring Boot 1.4.0 中却不行。感谢您的时间@AndyWilkinson 【参考方案1】:

最后,我解决了将 querydsl-jpa 3.7.4 库更新为 QueryDSL 4 的问题(并修改了我的代码)。似乎 Spring Boot 1.4 不再与 QueryDSL 3 兼容(因为 Spring Data JPA 1.10 升级到 Querydsl 4)。

谢谢。

【讨论】:

我也面临同样的问题。您能否在此处发布 spring boot 并查询适合您的 dsl jar 版本?【参考方案2】:

对于 Spring Boot 提供集成的库,您应该使用 BOM 依赖项。基本上在你的 pom/parent pom 中有这个:

<dependencyManagement>
 <dependencies>
    <dependency>
        <!-- Import dependency management from Spring Boot -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>1.4.0.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>

当你指定真正的依赖时,删除版本:

<dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
</dependency>

 <dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-sql</artifactId>
</dependency>

这保证了兼容性,因为 BOM 依赖项负责为您提供正确的版本。

更多信息here

【讨论】:

【参考方案3】:

Ulises 的回答是正确的,你可以使用

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

也要管理依赖。只需检查 dependence version managed by spring boot 以获取正确的 Group IDArtifact ID

【讨论】:

您的回答与 Ulises 的回答有何不同? 我只想提另一个使用父标签管理依赖的选项。链接文档的另一个原因是spring boot com.mysema.querydsl 管理的组名已经更改为com.querydsl,因此查看此类信息的最佳位置是链接文件。

以上是关于Spring Boot 1.4 QueryDSL 依赖问题的主要内容,如果未能解决你的问题,请参考以下文章

带有 QueryDSL 和 Gradle 的 IntelliJ 15

Spring Boot+JPA+QueryDSL=找不到OrderSpecifier

NoSuchMethodException QueryDSL 与 Spring Boot 和 Spring Data Mongo

Spring Boot,Hibernate,Querydsl:antlr.NoViableAltException:意外令牌

Spring Boot QueryDsl 返回原因:java.lang.UnsupportedOperationException: null

Spring Boot/Gradle/Querydsl项目有相同的依赖依赖于不同版本的另一个依赖