본문 바로가기
Spring/이론

JPQL

by 모스키토끼 2020. 5. 17.

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 )

'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

댓글