【问题标题】:Code Generation when using QueryDSL JPA and SQL together一起使用 QueryDSL JPA 和 SQL 时的代码生成
【发布时间】:2016-10-16 03:29:50
【问题描述】:

您好,我对结合 QueryDSL JPA 和 SQL 时的代码生成有疑问。根据QueryDQL创建者的一个SO问题的回答,这两个模块的组合是CRUD操作(JPA)和查询(SQL)的流行用法。

只使用JPA模块成功后,我尝试添加SQL模块,但不知道是否应该将SQL的代码生成添加到pom中。

事实上,我正在寻找 insert 函数,但在 JPA 模块中找不到它,这就是我尝试使用 SQL 的原因。

另外,当我尝试从 QueryDslPredicateExecutor 扩展 Spring Repository 时,出现错误:

com.mysema.query.types.Predicate 类型无法解析。它是从所需的 .class 文件中间接引用的

有人说这是 Eclipse 配置问题,但我无法解决问题。

QueryDSL 版本是 4.1.2,Spring Boot 是 1.3.5。那么什么是正确的版本呢?

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>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-sql-spring</artifactId>
        <version>${querydsl.version}</version>
    </dependency>
    ....
    <plugin>
            <groupId>com.mysema.maven</groupId>
            <artifactId>apt-maven-plugin</artifactId>
            <version>1.1.3</version>
            <executions>
                <execution>
                    <goals>
                        <goal>process</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/generated-sources/java</outputDirectory>
                        <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                    </configuration>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>com.querydsl</groupId>
                    <artifactId>querydsl-apt</artifactId>
                    <version>${querydsl.version}</version>
                </dependency>
            </dependencies>
        </plugin>

【问题讨论】:

  • Spring Boot 1.3.5,有一个用于 querydsl 3 而不是 4 的 spring-data-jpa 版本。另外,如果您已经使用 JPA,为什么还需要生成插入?基本上完全超越了 JPA 的目的。
  • 目前只是为了学习QueryDSL,我发现SQL模块只有insert函数。
  • 这有什么更新吗? querydsl-core jar 显然包含 Predicate 类,我不明白为什么 eclipse 抱怨

标签: spring spring-boot querydsl


【解决方案1】:

M. Deinum 的评论应该是公认的答案。 Spring boot 1.3.5 确实依赖于 spring-data-jpa 1.9.4,它被设置为使用 querydsl 3.*,你可以看到它引用了这样的包:

com.mysema.query.types.Predicate

从 querydsl 4.0 开始,新的包都是:

com.querydsl.*

看来我们需要升级到 spring boot 1.4,它基于 spring-data 1.10,它使用 querydsl 4.0

http://docs.spring.io/spring-data/jpa/docs/1.10.2.RELEASE/reference/html/#new-features

【讨论】:

【解决方案2】:

您可以通过添加jpa 分类器来使用querydsl-apt 中的注释处理器,而不是使用apt-maven-plugin

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

这样 Maven 和您的 IDE(例如,IDEA)都可以生成 Q 类,您无需指定 apt-maven-plugin

对于 Querydsl 4,您需要使用 Spring Boot 1.4.0+ 或在 dependencyManagement 中覆盖 spring-data-commons (1.12.1.RELEASE) 和 spring-data-jpa (1.10.2.RELEASE)。

【讨论】:

    【解决方案3】:

    如果你使用org.springframework.data.jpa.repository.JpaRepository,你可以使用:

    User user = repository.save(user);
    

    这里来自 CrudReporsitory.save() javadoc:

    保存给定的实体。使用返回的实例进行进一步操作 因为保存操作可能已经完全改变了实体实例。

    如果实体不是新实体,则调用 mergemerge 将其参数的状态复制到具有相同 ID 的附加实体中,并返回附加实体。如果实体不是新实体,并且您不使用返回的实体,您将对分离的实体进行修改。

    为了让
    SQLQueryFactory queryFactory = new SQLQueryFactory(configuration, dataSource); 工作,我拼命工作了好几个小时,

    然后我最后一次敲了它,记得有这个save方法。

    关于savehere的好答案。

    【讨论】:

      猜你喜欢
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 2014-05-30
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2018-06-03
      相关资源
      最近更新 更多