He definido mi DTO y luego tampoco puedo localizarlo. Creé DTO en el paquete de entidades y acabo de importar el paquete donde lo necesitaba, no dio ningún error al compilarlo, dio un error al ejecutar el código que ocurrió después de Inicializar JPA EntityManagerFactory, por qué, por favor, ayúdenme.

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

Mi error

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

Por favor ayúdame a resolverlo. Permítame decirle con esta consulta lo que quería hacer. Solo necesitaba la suma de todos los precios donde el nombre de usuario es el usuario que inició sesión y el estado es una cadena.

1
Prateek Kumar 28 jul. 2020 a las 17:38

1 respuesta

La mejor respuesta

Debe utilizar el nombre completo:

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

Cuando consulta por Entidades, puede usar el nombre de la Entidad que, si no se establece, es el nombre simple de la Clase.

Pero con los DTO no existe tal nombre, por lo que debe usar el nombre completo.

Además tienes que cambiar el constructor a

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

Porque suma devuelve mucho.

0
Simon Martinelli 28 jul. 2020 a las 15:33