[ User 엔티티 클래스 ]
> userId, userName, userEmail, userPwd 네개의 필드를 가지고 있다.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Column;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "userInfo")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
@Column(nullable = false)
private String userName;
@Column(nullable = false)
private String userEmail;
@Column(nullable = false)
private String userPwd;
}
[ UserRepository ]
findSelectedColumns() 메소드 생성하고 UserMapping 인터페이스를 만들어 필요한 컬럼만 매핑해준다.
* JPQL 사용
@Query 어노테이션과 함께 괄호 안에 쿼리문을 써준다. ( 'User' 엔티티 클래스 에서 해당 필드명으로 값을 가져옴 )
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
// JPQL
@Query("SELECT u.userId AS id, u.userName AS name FROM User u")
List<userMapping> findSelectedColumns();
interface UserMapping {
String getUserId();
String getUserName();
}
}
* 네이티브 쿼리 사용
@Query 어노테이션과 함께 (value="(쿼리문)" / nativeQuery = true) 형식으로 써준다.
( db테이블 'userInfo'에서 해당 컬럼명으로 값을 가져옴 )
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
// nativeQuery
@Query(value = "SELECT userId AS id, userName AS name FROM userInfo", nativeQuery = true)
List<userMapping> findSelectedColumns();
interface UserMapping {
String getUserId();
String getUserName();
}
}
[ 서비스로직 ]
// 생략..
List<UserRepository.UserMapping> userList = userRepository.findSelectedColumns();
=> List의 타입은 UserRepository.userMapping으로 해서 미리 정지해둔 컬럼들만 list로 받아줬다.
* userMapping 인터페이스가 필요한 이유 *
네이티브 쿼리에서
쿼리문으로는 (db테이블에서) 일부 컬럼(userId, userName)만 가져왔는데,
모든 컬럼을 필드로 가지고 있는 엔티티 클래스와 매핑할 경우,
초기화되지 않은 필드(userEmail, userPwd의 값이 없음)가 있어 오류가 난다.
대충 이런 오류.. Unable to find column position by name: 필드명 [Column ' 필드명 ' not found.]
** JPA 엔티티는 전체 필드가 매핑되어야 한다.
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
// nativeQuery
@Query(value = "SELECT userId AS id, userName AS name FROM userInfo", nativeQuery = true)
List<User> findSelectedColumns();
}
따라서 userMapping 인터페이스를 만들어 일부 엔티티만 매핑해줬다.
아니면 DTO타입으로 받은 후에 엔티티와 매핑해줘도 된다.
'Java > JPA' 카테고리의 다른 글
[JPA] Querydsl 벌크삭제 (2) (0) | 2025.01.27 |
---|---|
[JPA] 네이티브 쿼리 (조건문) + 오류 (0) | 2024.10.12 |
[JPA] JPA_existBy~ / Querydsl 성능비교 (+ fetchOne(), fetchFirst()) (0) | 2024.06.21 |
[JPA] List<Entity> 비교 (0) | 2024.06.19 |
[JPA] findById, existsById, getById (0) | 2024.06.19 |