Spring Data JPA - 规范和 Querydsl

Posted

技术标签:

【中文标题】Spring Data JPA - 规范和 Querydsl【英文标题】:Spring Data JPA - Specifications and Querydsl 【发布时间】:2016-02-17 21:44:01 【问题描述】:

我正在尝试使用 Spring Data 将 QueryDSL 集成到我现有的项目中,我尝试了不同的示例,现在我决定坚持使用这个 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 正确集成到我的项目中?提前致谢!

【问题讨论】:

你有querydsl-apt作为依赖吗? 当然,我会用依赖项详细信息更新帖子 你需要querydsl-jpa 而不是querydsl-sql 我有 querydsl-sql 而不是 querydsl-jpa,不知道这里有什么区别...我最终关注了这个github.com/querydsl/querydsl/tree/master/querydsl-jpa,但使用了 1.0 版的插件,因为我无法访问使最后一个 versin 工作 【参考方案1】:

我完成这项工作的方法是使用 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 而不是生成源中的子目录。 查看this question中的相关答案,并以lombok和mapstruct为例 对于任何正在阅读的人来说,如果你有多个模块的maven结构,那么将被处理的只有你定义插件的模块中的实体。【参考方案2】:

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

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

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

【讨论】:

以上是关于Spring Data JPA - 规范和 Querydsl的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA - 规范和 Querydsl

干货|一文读懂 Spring Data Jpa!

Spring Data JPA 整合Spring

Spring Boot,JPA和Ignite

简述 JPA 与 Spring Data JPA 与 Hibernate

Spring Data JPA:创建规范查询获取连接