• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

OrderQueryRepository 에러

24.01.22 16:48 작성 조회수 162

0

OrderItemQueryDto와 OrderQueryDto를 생성한 후, OrderQueryRepository를 생성하여 학습하고 있는데 강의 내용과는 다르게 진행중입니다. (밑에 질문 글에 한번 올렸었습니다.)

 

스프링데이터JPA로 진행하다보니 @Query를 작성하여 연습하는 중

java.lang.IllegalStateException: Cannot instantiate class 'jaein.crudpractice.repository.order.query.OrderItemQueryDto' (it has no constructor with signature [java.lang.Long, java.lang.String, java.time.LocalDateTime, java.time.LocalDateTime], and not every argument has an alias)

 

자꾸 생성자쪽에서 문제가 발생합니다.

 

OrderItemQueryDto

package jaein.crudpractice.repository.order.query;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jaein.crudpractice.domain.OrderItem;
import lombok.Data;

@Data
public class OrderItemQueryDto {

    @JsonIgnore
    private Long orderId;
    private String itemName;
    private int count;

    public OrderItemQueryDto(Long orderId, String itemName, int count) {
        this.orderId = orderId;
        this.itemName = itemName;
        this.count = count;
    }

}

 

OrderQueryDto

package jaein.crudpractice.repository.order.query;

import jaein.crudpractice.domain.Order;
import jaein.crudpractice.domain.OrderItem;
import jaein.crudpractice.domain.OrderStatus;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Data
@EqualsAndHashCode(of = "orderId")
public class OrderQueryDto {

    private Long orderId;
    private String name;
    private LocalDateTime loanDate;
    private LocalDateTime returnDate;
    private List<OrderItemQueryDto> orderItems;

    public OrderQueryDto(Long orderId, String name, LocalDateTime loanDate, LocalDateTime returnDate, List<OrderItemQueryDto> orderItems) {
        this.orderId = orderId;
        this.name = name;
        this.loanDate = loanDate;
        this.returnDate = returnDate;
        this.orderItems = orderItems;
    }
}

 

OrderQueryRepository

package jaein.crudpractice.repository.order.query;

import jaein.crudpractice.domain.Order;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface OrderQueryRepository extends JpaRepository<Order, Long> {


    @Query("select distinct new jaein.crudpractice.repository.order.query.OrderQueryDto(" +
            "o.id, s.name, o.loanDate, o.returnDate, oi) " +
            "from Order o " +
            "join o.student s " +
            "join o.orderItems oi")
    List<OrderQueryDto> findOrderQueryDtos(Pageable pageable);

    @Query("select distinct new jaein.crudpractice.repository.order.query.OrderItemQueryDto(" +
            "oi.order.id, i.name, oi.count)" +
            " from OrderItem oi " +
            " join oi.item i " +
            " where oi.order.id = :orderId")
    List<OrderItemQueryDto> findOrderItems(@Param("orderId") Long orderId);

}

 

생성자도 다 맞게 작성했는데 어느부분이 잘못됐는지 모르겠습니다.

강의대로 EntityManager를 사용하여 해보아도 같은 에러가 발생합니다.

도메인에서 연관관계 매핑에서 문제가 있는걸까요??

답변 1

답변을 작성해보세요.

0

David님의 프로필

David

2024.01.22

안녕하세요. wodlszz님, 공식 서포터즈 David입니다.

 java.lang.IllegalStateException: Cannot instantiate class 'jaein.crudpractice.repository.order.query.OrderItemQueryDto' (it has no constructor with signature [java.lang.Long, java.lang.String, java.time.LocalDateTime, java.time.LocalDateTime], and not every argument has an alias)

오류 메시지를 읽어보면, OrderItemQueryDto에는 Long, String, LocalDateTime, LocalDateTime을 시그니처로 가지는 생성자가 없다고 합니다.

즉, OrderItemQueryDto(Long long, String string, LocalDateTime localDateTime1, LocalDateTime localDateTime2)와 같은 형태의 생성자가 없다는 뜻입니다.

어디선가 위와 같은 형태로 생성자를 작성하셨기 때문에 발생한 문제로 보이며, 없는데 동일한 증상이 발생한다면 빌드 폴더를 삭제 후 다시 빌드하신 뒤 시도해 주세요:)

감사합니다.

wodlszz님의 프로필

wodlszz

질문자

2024.01.23

OrderQueryDtos에서 orderItems를 List<OrderItemQueryDto> 타입으로 받아서 생기는 문제인건 확인했습니다.

그렇게 되면 @Query에는 어떤식으로 변화를 주어야하는지 궁금합니다.