【问题标题】:QueryDSL annotation processor and gradle pluginQueryDSL 注释处理器和 gradle 插件
【发布时间】:2020-05-13 23:32:39
【问题描述】:

无法理解如何在没有任何 jpa/jdo/mongo 的情况下配置 build.gradle 以使用 querydsl 注释处理器。我想使用@QueryEntity 注解生成 Q 类,这样我就可以使用 DSL 支持编写动态 SQL 查询,然后将查询转换为纯文本并将其提供给 Spring R2DBC DatabaseClient 执行器。

有没有办法使用 gradle querydsl apt 插件和 querydsl 注释处理器在 build.gradle 文件中生成带有 @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()
}

【问题讨论】:

    标签: spring-boot gradle querydsl spring-data-r2dbc


    【解决方案1】:

    一般来说,您不应该使用 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 annotatios 生成 Q 类?
    • 糟糕,抱歉,我的意思是将 JPA 部分编辑为 SQL。这能解决你的问题吗?
    • 在构建过程中不会在构建/生成文件夹中生成任何Q类(只是/生成文件夹也不会出现)。
    • 好的,我发现了问题,我需要为querydsl-apt 定义适当的分类器。默认queryDslAnnotationProcessor 的正确分类器是general。所以"com.querydsl:querydsl-apt:${queryDslVersion}:general"。更正你的答案,我会在你的答案上打勾。
    • 将 javax.annotations 作为 annotationProcessor 添加到您的答案中,否则 Unable to load class 'javax.annotation.Generated'. 感谢您的帮助! =)
    【解决方案2】:

    我想在这里留下这个答案,因为我挣扎了几个小时才找到一个适用于 Kotlin 的解决方案(据我所知,这个问题没有 Java 限制,而且确实这方面的信息很少)。 Kotlin 支持使用 kapt plugin 进行注释处理。为了将此插件用于 QueryDSL,您需要 1. 定义 kapt 插件,以及 2. 指定将执行处理的依赖项,在本例中为 com.querydsl:querydsl-apt。我使用general 任务来执行我的插件,但根据documentation,还有其他可用选项(可能这对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 并查询 dsl jpa v4.4.0
    【解决方案3】:

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

    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')
    
    }
    

    【讨论】:

      【解决方案4】:

      这行得通!!!

        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"
                  )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-23
        • 2021-12-21
        • 2017-07-15
        • 2017-05-23
        • 1970-01-01
        • 2021-02-03
        • 2013-03-13
        • 1970-01-01
        相关资源
        最近更新 更多