未生成查询 DSL Q 类型类

问题描述 投票:0回答:6

我正在尝试在我的 eclipse maven 项目中使用 QueryDSL。这些是依赖项。

<properties>
        <!-- The main class to start by executing java -jar -->
        <start-class>my.app.market.DBApp</start-class>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <querydsl.version>4.1.4</querydsl.version>
        <apt-maven-plugin.version>1.1.3</apt-maven-plugin.version>

</properties>

<dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>4.1.4</version>
            <scope>provided</scope>
        </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.6.1</version>
        </dependency>

<build>
        <plugins>
            <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</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

此后我尝试编写查询。

@Repository
public class QueryDSLRepo {

    @PersistenceContext
    private EntityManager em;

    public ReportingParamDAO save(final ReportingParamDAO reportingParamDAO) {
        em.persist(reportingParamDAO);
        return reportingParamDAO;
    }

    public List<ReportingParamDAO> findreportingParamDAOsByIdQueryDSL(final Integer id) {
        final JPAQuery<ReportingParamDAO> query = new JPAQuery<>(em);
        final QReportingParamDAO reportingParamDAO = QReportingParamDAO.reportingParamDAO;

        return query.from(reportingParamDAO).where(reportingParamDAO.id.eq(id)).fetch();
    }


}

但我收到错误

QReportingParamDAO cannot be resolved to a type

注意:

ReportingParamDAO
是实体类。

这意味着我的 DAO 的 Q 类型类没有生成。我不确定为什么它没有生成。我还需要做其他事情吗?我遇到了 this 帖子,但用户正在处理

IntelliJ
,我似乎无法让它在我的情况下工作。有人可以帮帮我吗。谢谢!!

java spring eclipse querydsl
6个回答
12
投票

我已经用你的 pom.xml 进行了测试。 Q 类是为我生成的,但我无法从源代码中访问它们。问题是生成的源默认不在类路径上。将其添加到类路径中,您将能够在源代码中使用它们。

  1. 检查 target/ generated-sources 目录以查看这些类是否确实存在。 (你应该能够找到它们,因为我用你的 pom.xml 进行了测试)
  2. 如果将目标/生成源添加到类路径,您的应用程序将运行。但我认为这不是一个好主意。因为类路径中的所有文件都会被 IDE 索引,并且你的 IDE 会变慢。 generated-sources 文件夹中的所有文件不需要建立索引。因此,将
    target/generated-sources/java
    添加到类路径中,并将生成的 Q 类的 query-dsl 插件更改为
    target/generated-sources/java

3
投票

就我而言,导致错误的是 Java 14(预览功能)中的

""" multiline string """
语法。

我通过

mvn clean compile -e
弄清楚了。


2
投票

我最近也遇到了同样的问题。

似乎 apt-maven-plugin 不喜欢空的 .java 文件。 如果你的项目中有一个,他不会生成任何类而不指示空文件,这可能很难找到。


0
投票

为了解决这个问题,我将插件 com.mysema.maven 放在插件 org.codehaus.mojo 之前,这使得生成的源代码被放在正确的文件夹中并被 intelijj 识别。例子:

       ...

        <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>${basedir}/target/generated-sources</outputDirectory>
                        <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>${build.helper.maven.version}</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>add-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <source>target/generated-sources</source>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        ....

    </plugins>
</build>

0
投票

注意:我正在使用 IntelliJ

我在生成文件(Q 类)时遇到了麻烦,结果发现使用 IntelliJ 构建我的 Maven 项目不起作用,所以我必须在命令行中运行此命令来构建项目:

./mvnw install

这些文件是为我生成的,为了能够在我的源代码中使用这些生成的文件,我必须标记包含这些文件的文件夹 文件作为“生成的源根”,因此在本例中导航到此路径:

target/generated-sources/java

鼠标右键单击 java 文件夹 --> 将目录标记为 --> 生成的源根目录。

此后,您将能够在源代码中导入这些 Q 类。


0
投票

我在 2024 年使用 QueryDSL 版本 5.1.0 时遇到了同样的问题,我使用包含“jakarta”的“classifier”字段解决了这个问题,如下所示:

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <version>${querydsl.version}</version>
    <classifier>jakarta</classifier>
    <scope>provided</scope>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.