uId의 중복을 체크하기 위해서 uId로 db 검색을 해야했다. 그래서 repository에 jpa method를 추가하고 실행했는데 실행이 되지 않았다.
jpa 메소드에 있는 uId가 도메인 attribute에서 찾을 수 없다고 에러가 난다. 검색해보니 다른 경우는 보통 변수의 첫 글자를 대문자로 해서 그런 경우가 많았는데 그런 경우도 아니다. mysql에도 테이블이 만들어져있다.
Caused by: java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [UId] on this ManagedType [com.example.prac1201.domain.User]
⌨️ UserRepository
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUId(String uId);
}
⌨️ User
@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "user2")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String uId;
private String password;
private String name;
}
https://github.com/spring-projects/spring-data-commons/issues/1996
변수명이 소문자-대문자로 시작하면 spring-data-jpa 버그로 인해 파싱이 잘 안 된다고 한다. 변수명을 변경하거나 @Query
어노테이션을 사용하면 된다.
⌨️ UserRepository
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.uId =:uId")
Optional<User> findByUId(String uId);
}