无法在 Spring 引导应用程序中找到 DTO

Unable to locate DTO in Spring Boot Application

我已经定义了我的 DTO,但它也找不到它。 我已经在实体包中创建了 DTO,并且只是在我需要的任何地方导入了包,它在编译时没有给出任何错误,而 运行 它在初始化 JPA EntityManagerFactory 之后出现的代码为什么所以请帮助我。

CartDTO file

package com.project.books.entity;

public class CartDTO {

    private String name;
    private String username;
    private String status;
    private int price;
    
    public CartDTO() {
        
    }
    
    public CartDTO(String name, String username, String status, int price) {
        this.name = name;
        this.username = username;
        this.status = status;
        this.price = price;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    
    
}

cartRepository file

package com.project.books.dao;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import com.project.books.entity.Cart;
import com.project.books.entity.CartDTO;

public interface CartRepository extends JpaRepository<Cart,Integer> {

    @Query("select c from Cart c where c.username = :username AND c.status = :status")
    public List<Cart> findAllByUsernameAndStatus(@Param("username")String username,
                                                @Param("status")String status);
    
    
    @Query("select new CartDTO(c.name,c.username,c.status,sum(c.price)) from Cart c where c.username = :username AND c.status = :status GROUP BY username,status")
    public CartDTO sumPriceByUsernameAndStatus(@Param("username")String username,
                                                @Param("status")String status);
}

Myerror

Unable to locate class [CartDTO]
    at org.hibernate.hql.internal.ast.tree.ConstructorNode.resolveConstructor(ConstructorNode.java:177) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final]
    at org.hibernate.hql.internal.ast.tree.ConstructorNode.prepare(ConstructorNode.java:144) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final]
    at org.hibernate.hql.internal.ast.HqlSqlWalker.processConstructor(HqlSqlWalker.java:1258) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final]


 Error creating bean with name 'cartRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract com.project.books.entity.CartDTO com.project.books.dao.CartRepository.sumPriceByUsernameAndStatus(java.lang.String,java.lang.String)!
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:176) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:101) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]



 Validation failed for query for method public abstract com.project.books.entity.CartDTO com.project.books.dao.CartRepository.sumPriceByUsernameAndStatus(java.lang.String,java.lang.String)!
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:93) ~[spring-data-jpa-2.3.2.RELEASE.jar:2.3.2.RELEASE]

 Unable to locate class [CartDTO] [select new CartDTO(c.name,c.username,c.status,sum(c.price)) from com.project.books.entity.Cart c where c.username = :username AND c.status = :status GROUP BY username,status]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final]
    at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) ~[hibernate-core-5.4.18.Final.j

请帮我解决一下。 让我通过这个查询告诉你我的意思我只需要所有价格的总和,其中用户名是用户登录,状态是一些字符串。

您必须使用完全限定名称:

@Query("select new com.project.books.entity.CartDTO(c.name,c.username,c.status,sum(c.price)) from Cart c where c.username = :username AND c.status = :status GROUP BY username,status")
public CartDTO sumPriceByUsernameAndStatus(@Param("username")String username,
                                            @Param("status")String status);

当您查询实体时,如果没有设置 Class 的简单名称,您可以使用实体名称。

但是 DTO 没有这样的名称,因此您必须使用完全限定名称。

此外,您必须将构造函数更改为

public CartDTO(String name, String username, String status, long price) {

因为和 returns 长。