Spring Data JPA - 规范和Querydsl

29

我正在尝试将QueryDSL集成到我的现有项目中与Spring Data一起使用,我尝试了不同的示例,现在我决定坚持这个示例Advanced Spring Data JPA - Specifications and Querydsl

问题:当我运行Maven generate-sources项目时,我遇到了这个错误。

error: Annotation processor 'com.mysema.query.apt.jpa.JPAAnnotationProcessor' not found

根据博客文章的指示,我正在将此插件添加到我的pom.xml文件中:

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

和依赖关系:

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

有人能指点我如何解决这个问题或者如何将QueryDSL正确地集成到我的项目中吗?谢谢!


1
你的依赖中有querydsl-apt吗? - Ori Dar
当然,我会在帖子中更新依赖细节。 - M.Octavio
1
你需要使用 querydsl-jpa 而不是 querydsl-sql - Ori Dar
我使用querydsl-sql而非querydsl-jpa,不确定它们之间的区别...最终我按照https://github.com/querydsl/querydsl/tree/master/querydsl-jpa进行了操作,但是我使用了1.0版本的插件,因为我无法让最新版本工作。 - M.Octavio
3个回答

51

我能让这个工作起来的方法是使用com.querydsl.apt.jpa.JPAAnnotationProcessor而不是com.mysema.query.apt.jpa.JPAAnnotationProcessor,并按下列方式更改依赖关系:

我能让这个工作起来的方法是使用com.querydsl.apt.jpa.JPAAnnotationProcessor而不是com.mysema.query.apt.jpa.JPAAnnotationProcessor,并按下列方式更改依赖关系:

<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-apt</artifactId>
  <version>4.0.6</version>
</dependency>
<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-jpa</artifactId>
  <version>4.0.6</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>${project.build.directory}/generated-sources</outputDirectory>
         <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
      </configuration>
    </execution>
  </executions>
</plugin>

我还在项目根目录下的命令行中执行了mvn eclipse:eclipse命令,以便更新Eclipse以包含生成的源代码。

更新:

将插件maven-apt-plugin替换为apt-maven-plugin,并将版本更改为1.1.3。


谢谢你的示例,运行得非常完美。请注意:为了避免出现异常,例如 “无法加载实体类[...] NoClassDefFoundError: com/querydsl/core/types/dsl/EntityPathBase”,似乎使用根目录 ${project.build.directory}/generated-sources 而不是生成源代码中的子目录非常重要。 - Chavjoh
请参考此问题中与lombok和mapstruct相关的答案示例:https://dev59.com/Fqrka4cB1Zd3GeqPbEU5 - Sam
对于任何正在阅读的人,如果您有多个模块的Maven结构,则将处理的实体仅限于定义插件的模块中的实体。 - Matjaz

2

不需要显式配置apt-maven-plugin,只需将以下依赖项添加到项目中(请注意jpa分类器):

<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-apt</artifactId>
  <version>${querydsl.version}</version>
  <classifier>jpa</classifier>
</dependency>

在涉及Jakarta Persistence的情况下:
<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-apt</artifactId>
  <version>${querydsl.version}</version>
  <classifier>jakarta</classifier>
</dependency>

此外,如果您需要比QuerydslPredicateExecutor提供更多功能的Querydsl,请查看https://github.com/infobip/infobip-spring-data-querydsl#JPA

0
我必须添加以下内容才能修复它。
<querydsl.version>5.0.0</querydsl.version>

<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>

<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
</dependency>

<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-core</artifactId>
<version>${querydsl.version}</version>
</dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接