Zdefiniowałem mój DTO, a także nie może go zlokalizować. Stworzyłem DTO w pakiecie podmiotów i zaimportowałem pakiet wszędzie tam, gdzie potrzebowałem, nie dał jej błędu podczas kompilacji wydawał błąd podczas uruchamiania kodu, który wystąpił po inicjalizacji JPA EntityManagering, dlaczego więc pomóż mi pomóc.

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

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

My |

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

Pomóż mi rozwiązać go. Pozwól, że powiem ci to zapytanie, co miałem na myśli, że potrzebowałbym sumę wszystkich cen, w których nazwa użytkownika jest użytkownikiem, a status jest jakiś ciąg.

1
Prateek Kumar 28 lipiec 2020, 17:38

1 odpowiedź

Najlepsza odpowiedź

Musisz użyć w pełni kwalifikowanej nazwy:

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

Po zapytaniu dla podmiotów możesz użyć nazwy jednostki, która nie ustawia prostej nazwy klasy.

Ale z DTO nie ma takiej nazwy, więc musisz użyć w pełni kwalifikowanej nazwy.

Dodatkowo musisz zmienić konstruktor do

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

Ponieważ suma zwraca długość.

0
Simon Martinelli 28 lipiec 2020, 15:33