使用 querydsl jpa 5.0.0 升级到 springboot 2.6.1

Posted

技术标签:

【中文标题】使用 querydsl jpa 5.0.0 升级到 springboot 2.6.1【英文标题】:Upgrade to springboot 2.6.1 with querydsl jpa 5.0.0 【发布时间】:2022-01-20 05:55:56 【问题描述】:

我正在尝试将我的 springboot 版本从 2.3.4 升级到 2.6.1。我将查询 dsl 与 jpa 和 apt-maven-plugin 一起使用。我的问题是,当我运行 maven compile 时,我无法再生成 QClasses。我注意到我不再能够使用旧版本的 querydsl(以前的 4.4.0 和 apt-maven-plugin 1.1.3)。现在当我尝试使用 4.4.0 时出现错误:

无法解析的导入 POM: com.querydsl:querydsl-bom:pom:4.4.0 在https://repo.maven.apache.org/maven2 中找不到

然后当我切换到 5.0.0 版本时,我遇到了另一个错误:

[INFO] --- apt-maven-plugin:1.1.3:process (默认) @ gof-referentiel-backend --- [警告] 工件 org.apache.commons:commons-io:jar:1.3.2 已重新定位到 commons-io:commons-io:jar:1.3.2:https://issues.sonatype.org/browse/MVNCENTRAL-244 /home/ezek/Documents/projects/gof-referentiel-backend/src/main/java/fr/ubordeaux/gof/referentiel/common/persistence/dao/impl/ContactDAOImpl.java:12:错误:找不到符号 导入 fr.ubordeaux.gof.referentiel.common.persistence.entity.QContactEntity; ^ 符号:QContactEntity 类 位置:包 fr.ubordeaux.gof.referentiel.common.persistence.entity /home/ezek/Documents/projects/gof-referentiel-backend/src/main/java/fr/ubordeaux/gof/referentiel/common/persistence/dao/impl/ContactDAOImpl.java:29:错误:找不到符号 私有静态最终 QContactEntity qContactEntity = QContactEntity.contactEntity;

对于所有使用实体的类,我都会收到此错误。并且什么也没有生成。

这是我的 pom.xml 的相关值:

> <dependency>
>      <groupId>com.querydsl</groupId>
>      <artifactId>querydsl-apt</artifactId>
>      <version>$querydsl.version</version> 
> </dependency> 
> <dependency>
>      <groupId>com.querydsl</groupId>
>      <artifactId>querydsl-jpa</artifactId>
>      <version>$querydsl.version</version> 
> </dependency>
> 
> <plugin>
>      <groupId>com.mysema.maven</groupId>
>      <artifactId>apt-maven-plugin</artifactId>
>      <version>1.1.3</version>
>      <executions>
>          <execution>
>              <phase>generate-sources</phase>
>              <goals>
>                  <goal>process</goal>
>              </goals>
>              <configuration>
>                  <outputDirectory>target/generated-sources/java</outputDirectory>      
> 
>                      <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
>              </configuration>
>           </execution>
>      </executions> 
></plugin>

如果可能相关(但我不认为),我也使用 mapstruct 和 lombok,因为 apt-maven-plugin 在它们之前运行。

【问题讨论】:

Spring Boot 2.6.1 支持开箱即用的 querydsl 5.0.0。所以删除 version 标签,让 Spring Boot 管理它。我怀疑您也可以从插件中删除phase。最后,querydsl-apt 依赖可以使用提供的范围。尝试同时使用所有这些不同的处理器(lombok、mapstruct 和 querydsl)可能是一个痛苦的过程。尤其是使用 lombok,因为它会做一些官方不允许做的事情。 另外,“错误”是警告而不是错误。检查 commons-io 的依赖项并使用正确的位置。 我设法删除了警告并删除了 querydsl 版本,但仍然得到相同的结果。该错误与警告下的错误相同 在运行的 maven 上启用调试并检查发生了什么。我不会惊讶这会是由龙目岛引起的。 但我不知道lombok应该在querydsl之前还是之后运行。我知道在以前的版本中它是在之后但也许...... 【参考方案1】:

看来您仍然(可能是过渡性地)依赖于一些 Querydsl 4.0.0 依赖项。您需要删除那些(我无法指出哪些,因为您没有在 sn-p 中包含完整的 POM)。

我还建议完全摆脱插件,而是使用依赖分类器:

 <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-apt</artifactId>
      <version>$querydsl.version</version> 
      <classifier>jpa</classifier>
      <scope>provided</scope>
 </dependency> 
 <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-jpa</artifactId>
      <version>$querydsl.version</version> 
 </dependency>

【讨论】:

摆脱插件意味着删除 apt-maven-plugin ? 是的。它不需要。 如何在构建过程中生成 QClasses?你能举个例子吗? 使用正确的分类器时,QClasses 会在常规编译阶段生成。

以上是关于使用 querydsl jpa 5.0.0 升级到 springboot 2.6.1的主要内容,如果未能解决你的问题,请参考以下文章

JPA 之 QueryDSL-JPA 使用指南

Spring Data JPA - 规范和 Querydsl

如何使用 Querydsl 更新 JPA 实体?

带有 Querydsl 的 JPA 谓词

Maven 使用 spring-data-jpa 和 querydsl 构建问题

JPA 复杂查询 - Querydsl