QueryDSL注解处理器和Gradle插件

7

无法理解如何配置build.gradle,以使用querydsl注释处理器而不使用任何jpa / jdo / mongo。我想使用@QueryEntity注释生成Q类,然后可以使用DSL支持组合动态SQL查询,然后将查询转换为纯文本并将其提供给Spring R2DBC DatabaseClient执行器。

在build.gradle文件中,是否有一种方法可以使用gradle querydsl apt插件和querydsl注释处理器来生成带有@QueryEntity注释的Q类?

我正在使用gradle 5、Spring Data R2DBC、Spring Boot,并计划将queryDsl与注释处理器集成。

这是我的当前build.gradle文件:

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.2.1.RELEASE'
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.8"
}

apply plugin: 'io.spring.dependency-management'

group = 'com.whatever'

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/milestone" }
}

ext {

    springR2dbcVersion = '1.0.0.RELEASE'
    queryDslVersion = '4.2.2'
}

dependencies {
    implementation("com.querydsl:querydsl-sql:${queryDslVersion}")
    implementation("com.querydsl:querydsl-apt:${queryDslVersion}")
    implementation('org.springframework.boot:spring-boot-starter-webflux')

    compileOnly('org.projectlombok:lombok')

    annotationProcessor('org.projectlombok:lombok')
    annotationProcessor('org.springframework.boot:spring-boot-configuration-processor')
    annotationProcessor("com.querydsl:querydsl-apt:${queryDslVersion}")
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    testImplementation('io.projectreactor:reactor-test')
}

test {
    useJUnitPlatform()
}
5个回答

11

一般来说,不应该使用QueryDSL插件。配置QueryDSL生成只需使用相关的querydsl模块、注解处理器和生成源目录即可。例如,与lombok集成,这个配置应该可以工作(你可能需要调整所需的确切QueryDSL模块):

buildscript {
    ext {
        springBootVersion = '${springBootVersion}'
        queryDslVersion = '4.2.2'
        javaxVersion = '1.3.2'
    }
}

plugins {
    id 'idea'
}

idea {
    module {
        sourceDirs += file('generated/')
        generatedSourceDirs += file('generated/')
    }
}

dependencies {
    // QueryDSL
    compile "com.querydsl:querydsl-sql:${queryDslVersion}"
    annotationProcessor("com.querydsl:querydsl-apt:${queryDslVersion}:general")

    // Lombok
    compileOnly "org.projectlombok:lombok:${lombokVersion}"
    annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
    implementation("org.projectlombok:lombok:${lombokVersion}")


    // Possibly annotation processors for additional Data annotations
    annotationProcessor("javax.annotation:javax.annotation-api:${javaxVersion}")

    /* TEST */
    // Querydsl
    testCompile "com.querydsl:querydsl-sql:${queryDslVersion}"
    testAnnotationProcessor("com.querydsl:querydsl-apt:${queryDslVersion}:general")

    // Lombok
    testImplementation("org.projectlombok:lombok:${lombokVersion}")
    testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}")
    testCompileOnly("org.projectlombok:lombok:${lombokVersion}")

}

额外信息: https://github.com/querydsl/querydsl/issues/2444#issuecomment-489538997


问题在于 com.querydsl:querydsl-apt:${queryDslVersion}:jpa 看起来只捕获 @Entity 注解。那么我该如何使用 @EntityQuery 注解生成 Q 类呢? - Viktor M.
抱歉,我本意是将 JPA 部分编辑为 SQL。这样解决了你的问题吗? - Ido Salomon
1
在构建过程中不会在build/generated文件夹中生成任何Q类(/generated文件夹也不会出现)。 - Viktor M.
好的,我找到了问题所在,我需要为 querydsl-apt 定义正确的分类器。默认的 queryDslAnnotationProcessor 的正确分类器是 general。因此,正确的依赖应该是 "com.querydsl:querydsl-apt:${queryDslVersion}:general"。请更正您的答案,我会将您的答案标记为正确的。 - Viktor M.
1
将javax.annotations添加为注解处理器到您的答案中,否则会出现“无法加载类'javax.annotation.Generated'”的错误。 感谢您的帮助!=) - Viktor M.
这个答案似乎只适用于使用IntelliJ的用户,因为它使用了Idea插件。如果没有IntelliJ,该怎么做呢? - James

7

我想在这里留下答案,因为我花了几个小时才找到适用于Kotlin的解决方案(据我所知,该问题没有Java限制,并且对于此问题真的很少有信息)。 Kotlin使用kapt插件支持注释处理。为了将此插件用于QueryDSL,您需要执行以下两个步骤:1.定义kapt插件;2.指定将进行处理的依赖项,在此示例中为com.querydsl:querydsl-apt。我使用了general任务来执行我的插件,但是根据文档,还有其他可用选项(可能对JPA、JDO、Hiberante有一些额外的调整有所帮助)。

plugins {
    kotlin("kapt") version "1.4.10"
}

dependencies {
    implementation("com.querydsl:querydsl-mongodb:4.4.0")
    kapt("com.querydsl:querydsl-apt:4.4.0:general")
}

现在,每当您运行gradle build时,注解处理器都会触发您使用@QueryEntity注解的类的DSL查询类生成。希望这对需要在Kotlin中使用此功能的人有所帮助。

不幸的是,这并没有解决我的问题。我使用了kapt插件1.4.32和query dsl jpa v4.4.0。 - FirePapaya

3

对于单个 Gradle 项目,只需将下面的代码添加到同一个 build.gradle 文件中:

对于多模块 Gradle 项目,请将下面的代码添加到包含 JPA 实体的模块的 build.gradle 文件中:

implementation("com.querydsl:querydsl-core:${queryDslVersion}") 
annotationProcessor(
        "com.querydsl:querydsl-apt:${queryDslVersion}:jpa",
        "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final",
        "javax.annotation:javax.annotation-api:1.3.2")

在包含JPA仓库的模块的build.gradle中添加以下行:

implementation("com.querydsl:querydsl-jpa:${queryDslVersion}")

2

这对我有用(请按照依赖项的完全相同顺序进行操作)

sourceSets {
  generated {
    java {
      srcDirs = ['build/generated/sources/annotationProcessor/java/main']
    }
  }
}


dependencies {
    api 'com.querydsl:querydsl-jpa:4.4.0'
    annotationProcessor 'org.projectlombok:lombok'
    annotationProcessor('com.querydsl:querydsl-apt:4.4.0:jpa')
    annotationProcessor('javax.annotation:javax.annotation-api')

}

1

这个有效!!!

  ext {
        queryDslVersion = '4.2.1'
        
    }
    
    sourceSets {
        main {
            java {
                srcDirs = ['src/main/java', 'build/generated/sources/annotationProcessor/java/main']
            }
        }
    }   
    
    
     dependencies {
            compile("com.querydsl:querydsl-core:${queryDslVersion}")
            compile("com.querydsl:querydsl-jpa:${queryDslVersion}")
        }
        
        dependencies {
        
            compile "com.querydsl:querydsl-jpa:${queryDslVersion}"
            compileOnly 'org.projectlombok:lombok:1.16.18'
            annotationProcessor(
                "com.querydsl:querydsl-apt:${queryDslVersion}:jpa",
                "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final",
                "javax.annotation:javax.annotation-api:1.3.2",
                "org.projectlombok:lombok"
            )

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