IntelliJ中未生成QueryDsl类

16

我有以下的类,我想用querydsl尝试一些基本的查询。使用intelliJ 2017.3,没有生成QUser类。我尝试过在Google上搜索我的问题,每个stackoverflow答案似乎提供了不同的解决方案(有些不起作用,有些我不理解因为我以前从未使用过这些东西),大多数教程似乎完全做不同的事情。

我已经尝试使用Spring Boot内置的任何内容进行查询(不知道是什么,只是看起来太基础了),查询工作得很好,所以我猜测这是一些配置问题(我是一个maven和spring新手)。

// User.java
@Entity
@Table(name = "symptoms")
public class Symptom
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    private String name;

    public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

我已将这些内容添加到pom.xml文件中:

    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>4.1.4</version>
    </dependency>

    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>4.1.4</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</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>
        </plugin>
3个回答

32
您可以通过以下方式解决问题:打开目标文件夹 --> 右键点击 generated-sources 文件夹 --> 标记为目录 --> 生成的源根目录
正确标记生成的源文件夹后,它应该可以正常工作。如果IntelliJ不能立即识别标记的文件夹并且错误仍然存在,则一般使用mvn clean install可以解决问题。

0
我的解决方案是使用querydsl 5.0.0和spring boot 3.1.3进行设置,而不需要com.mysema.maven:apt-maven-plugin。从Q类生成的角度来看,重要的是在org.apache.maven.plugins:maven-compiler-plugin配置中的annotationProcessorPaths。
<properties>
    ...
    <java.version>17</java.version>
    <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
    <querydsl.version>5.0.0</querydsl.version>
    <jakarta-persistence-api.version>3.1.0</jakarta-persistence-api.version>
    ...
</properties>

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

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-plugin.version}</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <encoding>UTF-8</encoding>
                <annotationProcessorPaths>
                    ...  
                    <path>
                        <groupId>com.querydsl</groupId>
                        <artifactId>querydsl-apt</artifactId>
                        <version>${querydsl.version}</version>
                        <classifier>jakarta</classifier>
                    </path>
                    <path>
                        <groupId>jakarta.persistence</groupId>
                        <artifactId>jakarta.persistence-api</artifactId>
                        <version>3.1.0</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>

-1

我已经成功地使用老式代码生成了 Q 类。只需调用一次,这些类就会在 target/generated-sources/java 中生成。您可以在倒数第二行更改此设置。

GenericExporter exporter = new GenericExporter();
exporter.setKeywords(Keywords.JPA);
exporter.setEntityAnnotation(Entity.class);
exporter.setEmbeddableAnnotation(Embeddable.class);
exporter.setEmbeddedAnnotation(Embedded.class);
exporter.setSupertypeAnnotation(MappedSuperclass.class);
exporter.setSkipAnnotation(Transient.class);
exporter.setTargetFolder(new File("target/generated-sources/java"));
exporter.export(ApplicationClass.class.getPackage());

在最后一行中,ApplicationClass 是启动 Spring 应用程序的类。

2
为什么不在终端中使用 mvn clean compile -DskipTests - Cataclysm
抱歉,生成qclass不需要您自己编写代码。您的配置可能有问题。您的@Table注释来自javax.presistence.*吗?在终端上运行mvn clean compile时会发生什么情况?在Intellij的常规设置中,Build, Execution, Deployment > Compiler > Annotation Processors,您有哪些值(只有在终端可以工作但Intellij不行的情况下才会出现这种情况)? - Sergio Gragera
@SergioGragera 自从我上次参与这个项目(那是一个大学项目)已经过去半年多了,但我又在我的电脑上重新拉取了它。mvn clean compile将源文件编译到/target/classes并显示BUILD SUCCESS。在IntelliJ中,我在左侧得到了两个类别:Default和Maven默认注释。我的项目位于Maven默认注释下。 - Xzenon
@SergioGragera @Table确实来自javax.persistence。终端的命令输出如下:clean - 删除目标;resources - 复制1个资源,复制13个资源;compile - 重新编译模块,编译33个源文件;BUILD SUCCESS - 总时间,完成于。我希望这就是你想要的。 - Xzenon
不,输出显示开始执行apt-plugin。另一方面,如果删除outputDirectory标签会发生什么?您确定目标中不存在qclasses吗? - Sergio Gragera
显示剩余2条评论

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