一起使用QueryDSL JPA和SQL时的代码生成

时间:2016-06-15 07:03:51

标签: spring spring-boot querydsl

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

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

事实上,我正在寻找插入功能而我无法在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>

3 个答案:

答案 0 :(得分: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,它基于使用querydsl 4.0的spring-data 1.10

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

答案 1 :(得分:0)

您可以通过添加apt-maven-plugin分类器来querydsl-apt使用jpa中的注释处理器,而不是使用<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <classifier>jpa</classifier> </dependency>

apt-maven-plugin

这样,Maven和IDE(例如IDEA)都可以生成Q类,您无需指定$('img.arrow').click(function() { $(this).toggleClass('image-active'); });

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

答案 2 :(得分:0)

如果您使用的是org.springframework.data.jpa.repository.JpaRepository,则可以使用:

User user = repository.save(user);

这是来自CrudReporsitory.save()javadoc:

  

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

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

我猛击头几个小时才能成功 SQLQueryFactory queryFactory = new SQLQueryFactory(configuration, dataSource);工作,

然后我最后一次撞击它并记得有save方法。

关于save here的良好答案。