본문 바로가기

Java Kotlin

[Java/SpringBoot] MySQL DB, JpaRepository를 활용했을 때의 오류 해결

문제 상황

프로젝트를 진행하던 도중, h2 database로 로컬 환경에서 테스트 했을 때는 잘 작동되었으나, MySQL로 DB를 교체한 뒤 AWS에 서버를 배포하니까 오류가 났음.....

오류 코드를 구글링 했을 때는 원하는 해결방법이 나오지 않아 조금 헤멨다가, 자세히 보니 SQL 테이블 관련해서 무언가 값이 나오지 않는 것 같아 Repository 클래스의 SQL문을 다른 방식으로 바꾸어서 해결했다. JOIN 시킬 때 해결 후 SQL문과 같이 명시적으로 조인 조건을 지정해줘야 되나보다.

혹시나 나와 같은 에러로 고통받는 사람이 있을까 싶어 기록해둔다......

 

오류 코드

Cannot invoke "org.hibernate.sql.ast.tree.from.TableGroup.getModelPart()" 
	because the return value of "org.hibernate.sql.ast.spi.FromClauseAccess.findTableGroup(org.hibernate.spi.NavigablePath)" is null

해결 전 SQL문 (JpaRepository 사용)

// (요청인 기준 검색) 특정 사용자와 완전 친구 상태인 사람들 중에서 검색 결과 가져오기
@Query("SELECT m FROM Friend f LEFT JOIN f.responseUser m WHERE f.requestUser = :requestUser"
+ " AND f.isFriend = true AND m.name LIKE :name")
List<User> getSearchFriendList(@Param("requestUser") User requestUser, @Param("name") String name);
    
// 해당 유저의 친구들 중, 외출 시간이 N분 남은 사람들 불러오기
@Query("SELECT m "
+ "FROM Friend f JOIN f.responseUser m JOIN m.schedules s "
+ "WHERE f.requestUser = :requestUser AND f.isFriend = true"
+ " AND s.date = :date"
+ " AND (s.outTime BETWEEN :startTime AND :endTime)")
List<User> getStingList(@Param("requestUser") User requestUser, @Param("date") LocalDate date,
            @Param("startTime") LocalTime startTime, @Param("endTime") LocalTime endTime);

해결 후 SQL문 (JpaRepository 사용)

// (요청인 기준 검색) 특정 사용자와 완전 친구 상태인 사람들 중에서 검색 결과 가져오기
@Query("SELECT m FROM Friend f LEFT JOIN User m ON f.responseUser = m"
        + " WHERE f.requestUser = :requestUser"
        + " AND f.isFriend = true AND m.name LIKE :name")
List<User> getSearchFriendList(@Param("requestUser") User requestUser, @Param("name") String name);

// 해당 유저의 친구들 중, 외출 시간이 N분 남은 사람들 불러오기
@Query("SELECT m "
        + "FROM Friend f JOIN User m ON f.responseUser = m"
        + " JOIN Schedule s ON m = s.user"
        + " WHERE f.requestUser = :requestUser AND f.isFriend = true"
        + " AND s.date = :date"
        + " AND (s.outTime BETWEEN :startTime AND :endTime)")
List<User> getStingList(@Param("requestUser") User requestUser, @Param("date") LocalDate date,
        @Param("startTime") LocalTime startTime, @Param("endTime") LocalTime endTime);