添加QueryDSL时,JPAqueryfactory无法解析为类型i springboot

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

我正在尝试了解在 springboot 中使用 JUnit 进行测试驱动开发。当我添加 queryDSL 查询时,我收到编译时错误,指出 JPA queryfactory 行上有

JPAqueryfactory cannot be resolved to a type
。并且无法运行项目,

我的 pom.xml 文件如下所示,

    <properties>
        <java.version>17</java.version>
        <querydsl.version>5.0.0</querydsl.version>
   </properties>
 <dependencies>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <scope>provided</scope>
        <classifier>jakarta</classifier>
        <version>${querydsl.version}</version>
    </dependency>
    <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-jpa</artifactId>
     </dependency>    
   </dependencies>
    <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

          <plugin>
             <groupId>com.querydsl</groupId>
             <artifactId>querydsl-maven-plugin</artifactId>
          </plugin>
       </plugins>
    </build>

生成的 Q 类型类在目标目录中如下所示,

enter image description here

我的控制器示例代码如下,

import com.devopsauthorize.model.QUsers;
import com.devopsauthorize.model.Users;
import com.devopsauthorize.services.UserService;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;


@RequestMapping("/cicd")
@RestController
public class PipelineController {

   @Autowired
   UserService userServiceObj;

   @PersistenceContext
   private EntityManager em;

   @GetMapping("/load")
   public String loadPipelineMessageMethod(){

    //return userServiceObj.retrieveUserRoleDetails("dmoore");
   QUsers users = QUsers.users;
   JPAQueryFactory queryFactory = new JPAQueryFactory(em);
   Users userObj = queryFactory.selectFrom(users)
        .where(users.susername.eq("cvo"))
        .fetchOne();

     System.out.println(userObj.susername);
      System.out.println(userObj.spassword);
      return userObj.spassword;
       // return "hello";
    }

}

如果我走错方向,任何人都可以指导我解决此错误或建议任何替代的实施方式吗?

enter image description here

spring-boot hibernate spring-mvc spring-data-jpa querydsl
1个回答
0
投票

您遇到的错误表明 JPAQueryFactory 类未得到解析,可能是由于缺少或错误配置依赖项或 QueryDSL 的注释处理问题。让我们一步步解决这个问题:


1。修复依赖配置

您的 pom.xml 配置需要正确设置 QueryDSL 依赖项并确保注释处理器正在工作。

已更新

pom.xml

<properties>
    <java.version>17</java.version>
    <querydsl.version>5.0.0</querydsl.version>
</properties>

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

    <!-- QueryDSL JPA -->
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${querydsl.version}</version>
    </dependency>

    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- Spring Boot Maven Plugin -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

        <!-- Annotation Processing for QueryDSL -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <annotationProcessorPaths>
                    <path>
                        <groupId>com.querydsl</groupId>
                        <artifactId>querydsl-apt</artifactId>
                        <version>${querydsl.version}</version>
                        <classifier>jakarta</classifier>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

2。生成Q类型类

确保正确生成 QueryDSL Q 类(例如 QUsers)。

1:运行Maven编译阶段:

mvn clean compile

2:验证 Q 类是否在 target/ generated-sources/java 下生成。

3:确保您的 IDE 配置为包含 target/ generated-sources/java 作为源文件夹。

3.实体管理器配置

确保在 Spring Boot 应用程序中正确配置 EntityManager。如果您使用 spring-boot-starter-data-jpa,Spring Boot 会自动配置它。

如果需要,请在 application.properties 中包含数据库配置:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update

4。调整代码

更新您的代码以确保它正确使用 JPAQueryFactory。 EntityManager 是使用 @PersistenceContext 注入的,因此设置看起来是正确的。

更新控制器:

import com.devopsauthorize.model.QUsers;
import com.devopsauthorize.model.Users;
import com.devopsauthorize.services.UserService;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.querydsl.jpa.impl.JPAQueryFactory;

@RequestMapping("/cicd")
@RestController
public class PipelineController {

    @Autowired
    UserService userServiceObj;

    @PersistenceContext
    private EntityManager em;

    @GetMapping("/load")
    public String loadPipelineMessageMethod() {
        QUsers users = QUsers.users;
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        Users userObj = queryFactory.selectFrom(users)
                .where(users.susername.eq("cvo"))
                .fetchOne();

        if (userObj != null) {
            System.out.println(userObj.getSusername());
            System.out.println(userObj.getSpassword());
            return userObj.getSpassword();
        }
        return "User not found";
    }
}

5。验证数据库和 QueryDSL 集成

  • 确保您的用户实体已使用 @Entity 正确注释。
  • 检查 QUsers 类以验证其生成的字段与您的 Users 实体匹配。

6。测试驱动开发设置

遵循 TDD:

使用 JUnit 和 Mockito 为 PipelineController 编写单元测试。 模拟 EntityManager 和 JPAQueryFactory 以模拟查询执行。 单元测试示例:

import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

import com.querydsl.jpa.impl.JPAQueryFactory;
import com.devopsauthorize.model.QUsers;
import com.devopsauthorize.model.Users;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class PipelineControllerTest {

    @Mock
    private JPAQueryFactory queryFactory;

    @InjectMocks
    private PipelineController pipelineController;

    @Test
    public void testLoadPipelineMessageMethod() {
        MockitoAnnotations.openMocks(this);

        QUsers users = QUsers.users;
        Users mockUser = new Users();
        mockUser.setSusername("cvo");
        mockUser.setSpassword("password123");

        when(queryFactory.selectFrom(users).where(users.susername.eq("cvo")).fetchOne())
                .thenReturn(mockUser);

        String result = pipelineController.loadPipelineMessageMethod();
        assertEquals("password123", result);
    }
}

7。重新运行项目

  • 重新启动项目并验证没有错误。
  • 测试 /cicd/load 端点以确保其按预期工作。

通过执行这些步骤,JPAQueryFactory 错误应该得到解决,您可以继续实施和测试您的应用程序。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.