【问题标题】:Unable to locate DTO in Spring Boot Application无法在 Spring Boot 应用程序中找到 DTO
【发布时间】:2020-11-18 01:06:23
【问题描述】:

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

CartDTO 文件

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 文件

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

我的错误

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

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

【问题讨论】:

    标签: java mysql spring-boot spring-data-jpa dto


    【解决方案1】:

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

    @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);
    

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

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

    另外你必须将构造函数更改为

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

    因为 sum 返回 long。

    【讨论】:

    • 试过了,但现在错误是“ org.hibernate.hql.internal.ast.DetailedSemanticException:无法在类 [com.project.books.entity.CartDTO] 上找到适当的构造函数。预期的参数是: java.lang.String, java.lang.String, java.lang.String, long" 和其他几个@Simron Martinelli
    猜你喜欢
    • 2022-12-15
    • 2020-01-07
    • 2020-03-22
    • 1970-01-01
    • 2020-04-17
    • 2021-11-25
    • 1970-01-01
    • 2020-04-18
    • 2018-09-18
    相关资源
    最近更新 更多