JPQL(Java Persistence Query Language)이란?
- SQL과 비슷한 문법을 가진 객체 지향 쿼리
기본 문법
기본적으로 SQL문과 흡사 But 차이점 존재
- 대소문자 구분
- Entity와 Entity 속성의 대소문자 구별
- Select와 같은 키워드는 구별 x
- 참조
- from 뒤에 사용하는 이름을 테이블 명이 아닌 Entity 객체 명을 사용
- 조인할 때 Entity의 속성 값으로 조인을 한다.
-> Subscription s, Member m 이 아닌 Subscription s Inner Join s.member m
- 별칭
- JPQL에서는 Entity의 별칭이 필수
예시 코드
- Member Entity
@Getter
@Setter
@EqualsAndHashCode(of = "userNo")
@ToString @Entity @ApiModel(description = "유저")
@Table(name = "member")
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_no")
private Long userNo;
@NotBlank
@Column(length = 25, nullable = false)
private String userId;
@NotBlank
@Column(length = 200, nullable = false)
private String userPw;
@NotBlank
@Column(length = 20, nullable = false)
private String userName;
@CreationTimestamp
private Date regDate;
@UpdateTimestamp
private Date upd_date;
- Subscription Entity
@Getter
@Setter
@EqualsAndHashCode(of = "subsNo")
@ToString
@Entity
@ApiModel(description = "구독")
@Table(name = "subscription")
public class Subscription {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long subsNo;
@CreationTimestamp
private Date regDate;
@ManyToOne
@JoinColumn(name = "user_no")
private Member member;
@ManyToOne
@JoinColumn(name = "subs_user_no")
private Member subsMember;
}
- Querty
@Query("SELECT b.subsNo, c.userNo, c.userId, c.userName, b.regDate) "
+ "FROM Subscription b INNER JOIN b.member a "
+ "INNER JOIN b.subsMember c "
+ "WHERE a.userNo = ?1 "
+ "ORDER BY a.regDate DESC")
설명
- Subscription Entity는 member와 subsMember 속성으로 Member Entity를 참조한다.
- Subscription을 b라는 별칭을 주고 Inner Join으로 Subscription에서 Member Entity를 참조하는 두 속성 값을 조인하고 별칭으로 각각 a, c를 주었다.
해결 경험
- 자바에서 사용하는 자료형으로 변환 가능
- ORM을 사용하면 Java에서 사용하는 자료형을 DB에 맞게 변환해준다. (예를 들어, Long타입으로 객체 속성을 설정한 뒤 테이블을 생성하면 Mysql에서는 자료형을BigInteger로 생성)
- 때문에 nativeQuery를 사용하여 select 한 경우 케스팅에 필요한 코드가 길어진다.
- JPQL을 사용하여 select한 경우 괄호로 바로 캐스팅 가능
- Object로 받아서 VO에 캐스팅했던 것을 자동 매핑
- Select한 데이터를 자동 메핑하기 위해서는 new Package명. 클래스명을 select 문 앞에 붙여준다.
->select new 패키지명.SubsVO( b.subsNo, c.userNo, c.userId, c.userName, b.regDate )
- Select한 데이터를 자동 메핑하기 위해서는 new Package명. 클래스명을 select 문 앞에 붙여준다.
'Spring > 이론' 카테고리의 다른 글
HtmlUnit (0) | 2020.06.03 |
---|---|
Test (0) | 2020.06.03 |
SpringBoot (0) | 2020.04.22 |
Restful Web Service with Spring (0) | 2020.04.20 |
Restful Web Service (0) | 2020.04.19 |
댓글