• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

데이터베이스 테이블에서 해당 컬럼을 찾을 수 없음이 뜹니다.

24.04.08 13:20 작성 24.04.08 13:21 수정 조회수 80

0

JPA 코드를 다 작성하고 실행하려고 할 때 DB에서 해당 컬럼을 찾을 수 없다고 뜨네요

아래는 에러코드입니다.

org.hibernate.exception.SQLGrammarException: could not prepare statement [Column "M1_0.USERNAME" not found; SQL statement:
select m1_0.id,m1_0.username from member m1_0 where m1_0.username=? [42122-224]] [select m1_0.id,m1_0.username from member m1_0 where m1_0.username=?]
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import jakarta.persistence.EntityManager;
import jakarta.persistence.*;
import java.util.List;
import java.util.Optional;
public class JpaMemberRepository implements MemberRepository {
    private final EntityManager em;

    public JpaMemberRepository(EntityManager em) {
        this.em = em;
    }

    public Member save(Member member) {
        em.persist(member);
        return member;
    }

    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }

    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }

    public Optional<Member> findByName(String name) {
        List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
                .setParameter("name", name)
                .getResultList();
        return result.stream().findAny();
    }

}

 

위에는 JpaMemberRepository 코드이고

아래는 테스트 코드입니다.

테스트 코드에서 오류가 발생 할 때 memberService.join에 빨간 밑줄이 생깁니다.

그리고 디버그 해보면 JpaMemberRepository 코드에서 findByName에 쿼리문 쪽에 문제가 발생했다고 뜹니다.. 코드는 다 똑같이 작성했는데 뭐가 문제일까요 ㅠㅠ

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;
    @Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("spring");
        //when
        Long saveId = memberService.join(member);
        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void 중복_회원_예외() {
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring");

        //when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }
}

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.08

안녕하세요, 인프런 AI 인턴입니다.
sim2님, 질문 내용을 바탕으로 유사한 문제를 해결한 내용을 찾아보았습니다.
문제의 핵심은 org.hibernate.exception.SQLGrammarException: could not prepare statement 에러로, 특정 컬럼(USERNAME)을 데이터베이스에서 찾을 수 없다는 것입니다.

이 경우, 에러 메시지에서 Column "M1_0.USERNAME"라는 부분에 주목할 필요가 있습니다. JPA를 사용할 때 Entity 클래스의 필드명과 데이터베이스의 컬럼명이 일치해야 하는데, 발생한 에러는 JPA가 데이터베이스에서 username 컬럼을 찾으려고 했으나 해당 컬럼을 찾을 수 없다는 것을 의미합니다.

다음은 참고할만한 유사한 문제 해결 내용입니다.

해당 문제와 관련 있을 수 있는 주요 원인은 다음과 같습니다.
1. Entity 클래스 내 필드명과 데이터베이스 컬럼명 불일치: Member 엔티티 클래스 내에서 정의한 필드명(name)과 데이터베이스 내의 컬럼명(username)이 서로 일치하지 않을 경우입니다.
2. @Column 어노테이션 누락: 필드명과 다른 컬럼명을 사용하는 경우 @Column(name="컬럼명")으로 정확하게 명시해야 합니다.

해결 방법:
- Member 클래스의 필드 명칭을 데이터베이스에 저장된 컬럼명과 정확히 일치시키거나,
- @Column 어노테이션을 사용하여 필드와 데이터베이스 컬럼명의 매핑을 명시적으로 선언해야 합니다.

테스트 코드상의 문제라기보다는, Member 엔티티 클래스의 정의에서 발생한 문제로 보입니다. 따라서 Member 클래스 내에 정의된 필드명이 데이터베이스의 컬럼명과 정확히 일치하는지 확인해 보시길 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

sim2님의 프로필

sim2

질문자

2024.04.08

해결했습니다!