繁体   English   中英

带有spring-boot-starter-jpa的QuerydslPredicate

[英]QuerydslPredicate with spring-boot-starter-jpa

我在com.querydsl中自动生成Q类时遇到问题。 我知道com.query.dsl和spring-boot-jpa之间的兼容性可能存在错误,但是我尝试了很多版本,但没有任何积极结果。 这是我的pom.xml

    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4.1212.jre7</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.12</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
        <version>1.4.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>21.0</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.3</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.6.1</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.6.1</version>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>4.0.7</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>com.mysema.maven</groupId>
            <artifactId>apt-maven-plugin</artifactId>
            <version>1.1.3</version>
            <executions>
                <execution>
                    <id>process-common-model</id>
                    <goals>
                        <goal>process</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/generated-sources/apt</outputDirectory>
                        <processors>
                            <processor>com.query.apt.jpa.JPAAnnotationProcessor</processor>
                        </processors>
                    </configuration>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>com.querydsl</groupId>
                    <artifactId>querydsl-apt</artifactId>
                    <version>4.0.7</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

错误

由以下原因引起:org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.data.jpa.repository.support.QueryDslJpaRepository]:构造方法引发了异常。 嵌套异常是java.lang.IllegalArgumentException:找不到域类com.coig.prek.webservice.modules.quiz.entiry.Quiz的查询类com.coig.prek.webservice.modules.quiz.entiry.QQuiz! 在org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154)〜[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]在org.springframework.data.repository.core.support上。 RepositoryFactorySupport.getTargetRepositoryViaReflection(RepositoryFactorySupport.java:365)〜[spring-data-commons-1.13.0.RELEASE.jar:na]在org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:101) )〜[spring-data-jpa-1.11.0.RELEASE.jar:na]在org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:81)〜[spring-data-jpa- 1.11.0.RELEASE.jar:na]在org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:199)〜[spring-data-commons-1.13.0.RELEASE.jar:na ] org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:277)〜[spring-data-commons-1.13.0.RELEASE.jar:na] at org.sp 在org.springframework.data.jpa.repository.support的ringframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:263)〜[spring-data-commons-1.13.0.RELEASE.jar:na] .JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:101)〜[spring-data-jpa-1.11.0.RELEASE.jar:na] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) 〜[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)〜[spring-beans-4.3.6 .RELEASE.jar:4.3.6.RELEASE] ...省略了47个共同的框架原因:java.lang.IllegalArgumentException:找不到域的查询类com.coig.prek.webservice.modules.quiz.entiry.QQuiz com.coig.prek.webservice.modules.quiz.entiry.Quiz类! 在org.springframework.data.querydsl.SimpleEntityPathResolver.createPath(SimpleEntityPathResolver.java:63)〜[spring-data-commons-1.13.0.RELEASE.jar:na]在org.springframework.data.jpa.repository.support。 QueryDslJpaRepository。(QueryDslJpaRepository.java:84)〜[spring-data-jpa-1.11.0.RELEASE.jar:na]在org.springframework.data.jpa.repository.support.QueryDslJpaRepository。(QueryDslJpaRepository.java:68)〜 [sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)处的[spring-data-jpa-1.11.0.RELEASE.jar:na](本机方法)〜sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java处的[na:1.8.0_111]: 62)在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)〜[na:1.8.0_111]在java.lang.reflect.Constructor.newInstance(Constructor.java:423)处[na:1.8.0_111] 〜[na:1.8.0_111]在org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)〜[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] ... 56常见框架省略 由以下原因引起:java.lang.ClassNotFoundException:com.coig.prek.webservice.modules.quiz.entiry.QQuiz在java.net.URLClassLoader.findClass(URLClassLoader.java:381)〜[na:1.8.0_111]在Java。 lang.ClassLoader.loadClass(ClassLoader.java:424)〜[na:1.8.0_111]在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:331)〜[na:1.8.0_111]在java.lang。 ClassLoader.loadClass(ClassLoader.java:357)〜[na:1.8.0_111]在org.springframework.util.ClassUtils.forName(ClassUtils.java:250)〜[spring-core-4.3.6.RELEASE.jar:4.3 .6.RELEASE]在org.springframework.data.querydsl.SimpleEntityPathResolver.createPath(SimpleEntityPathResolver.java:53)〜[spring-data-commons-1.13.0.RELEASE.jar:na] ... ...省略了63个共同的框架

仓库:

@Repository
public interface QuizRepository extends PagingAndSortingRepository<Quiz, Long>, QueryDslPredicateExecutor<Quiz> {
}

和实体:

@javax.persistence.Entity
@Table(name = "QUIZ", uniqueConstraints = {
        @UniqueConstraint(columnNames = "NAME")
})
@ToString
public class Quiz extends Entity{

    @Column(name = "NAME")
    private @Setter @Getter String name;
    @Column(name = "TYPE")
    private @Setter @Getter Integer type;
    @Column(name = "TIME")
    private @Setter @Getter Long time;
    @JsonProperty(value = "branch")
    @Column(name = "BRANCH")
    private @Setter @Getter Integer branch;

    @OneToMany
    private @Setter @Getter Set<Question> questions;

    public Quiz() {}

}

你能告诉我我是否错过了什么,或者我做错了什么? 谢谢你的帮助。

这是有关如何使用QueryDSL的示例

pom.xml文件中包括以下依赖项:

    <dependency>
        <groupId>io.springlets</groupId>
        <artifactId>springlets-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
    </dependency>

此外,包括以下插件以能够生成Q类:

            <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>
                    <dependency>
                        <groupId>com.querydsl</groupId>
                        <artifactId>querydsl-jpa</artifactId>
                        <version>${querydsl.version}</version>
                    </dependency>
                </dependencies>
            </plugin>

现在,创建一个名为QuizRepositoryCustom的新存储库接口,并定义要提供的方法。

public interface QuizRepositoryCustom {

  // SAMPLE METHOD TO SEARCH QUIZ BY NAME
  public Page<Quiz> findByNameLike(String name, Pageable pageable);

}

创建QuizRepositoryCustom的实现。 此类应扩展QueryDslRepositorySupport

public class QuizRepositoryImpl extends QueryDslRepositorySupport<Quiz> implements QuizRepositoryCustom {

    QuizRepositoryImpl() {
        super(Quiz.class);
    }

    public Page<Quiz> findByNameLike(String name, Pageable pageable) {

        QQuiz quiz = QQuiz.quiz;

        JPQLQuery<Quiz> query = from(quiz);

        if (StringUtils.isNotEmpty(name)) {
           BooleanBuilder searchCondition = new BooleanBuilder();                         

           searchCondition.and(quiz.name.eq(name));

           if (searchCondition.hasValue()) {
            query.where(searchCondition);
           }
        }

        long totalFound = query.fetchCount();
        List<Quiz> results = query.select(quiz).fetch();
        return new PageImpl<M>(results, pageable, totalFound);
    }

}

现在,延伸QuizRepository从接口JpaRepository<Quiz, Long>QuizRepositoryCustom接口。

public interface QuizRepository extends QuizRepositoryCustom, JpaRepository<Quiz, Long> {

}

通过这些简单的步骤,您将能够使用QueryDSL。

另外,您可以检查以下项目,其中包含有关如何使用QueryDSL的更多示例。

https://github.com/jcagarcia/proofs/tree/master/spring-security-and-formatters/src/main/java/org/springframework/roo/petclinic/repository

希望能帮助到你,

前几天,我也遇到了这个问题! 但这与您的问题有点不同,类似于:

Failed to introspect Class org.springframework.data.jpa.repository.support.QuerydslJpaRepository] from ClassLoader [sun.misc.Launcher$AppClassLoader@764c12b6]; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.data.jpa.repository.support.QuerydslJpaRepository] from ClassLoader [sun.misc.Launcher$AppClassLoader@764c12b6]

但是我相信这值得尝试:

这是这种情况:我克隆了一个具有querydsl实现并正在使用STS IDE的项目。

下载所有依赖项后,我运行了该项目,并成功了,但是在访问任何端点时,上述错误开始提示!

为此,我这样做了:

我进入.m2文件夹,删除了com/querydsl directory存在的querydsl-jpa文件夹,然后手动运行mvn clean [ install for war | package for jar ] mvn clean [ install for war | package for jar ]下载了所有依赖项并正确链接了它们!

重新运行spring项目后,一切正常。

造成此问题的原因:有时从maven或任何其他存储库下载依赖项时,jar文件可能会损坏,这在执行之前是无法检测到的,因此删除.m2文件夹中的jar并手动运行是有益的,因为有时IDE也可能损坏下载的罐子。

希望这能解决您的问题!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM