JPQL(Java Persistence Query Language)์ JPA(Java Persistence API)์์ ์ ๊ณตํ๋ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด์ ๋๋ค. SQL๊ณผ ์ ์ฌํ์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ด ์๋ Java ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ ์์ฑ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋
๋ฆฝ์ ์ธ ์ฟผ๋ฆฌ ์ธ์ด
JPA ๊ตฌํ์ฒด๊ฐ JPQL์ SQL๋ก ๋ณํํ์ฌ ์คํ
EntityManager๋ JPA์ ํต์ฌ ์ธํฐํ์ด์ค๋ก, JPQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
@Test
public void testEmCreateQuery() {
String qlString = "SELECT u FROM User u WHERE u.username = :username";
User findUser = em.createQuery(qlString, User.class)
.setParameter("username", "teasun")
.getSingleResult();
assertThat(findUser.getUsername()).isEqualTo("teasun");
}
๋ฌธ์์ด๋ก ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑ
setParameter()๋ฅผ ํตํ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ
ํ์ ์์ ์ฑ์ด ๋ถ์กฑํ๊ณ ์คํ์ ์ํ์ด ์์
Spring Data JPA์์๋ @Query ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฉ์๋์ ์ง์ JPQL์ ์ ์ํ ์ ์์ต๋๋ค.
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.username = :username")
List<User> findByUsername(@Param("username") String username);
@Query("SELECT u FROM User u WHERE u.username = ?1")
List<User> findByUsernamePositional(String username);
}
๋ฉ์๋ ์๊ทธ๋์ฒ์ ์ฟผ๋ฆฌ๋ฅผ ํจ๊ป ์ ์
์ด๋ฆ ๊ธฐ๋ฐ ๋๋ ์์น ๊ธฐ๋ฐ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ์ง์
์ปดํ์ผ ์์ ์ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ ์ค๋ฅ ๊ฒ์ถ ๊ฐ๋ฅ
๊ฐ์ฒด ์งํฅ์ ์ธ ์ฟผ๋ฆฌ ์์ฑ ๊ฐ๋ฅ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋
๋ฆฝ์ ์ธ ์ฟผ๋ฆฌ ์์ฑ
๋ณต์กํ ์กฐ์ธ, ์๋ธ์ฟผ๋ฆฌ ๋ฑ ๊ณ ๊ธ ์ฟผ๋ฆฌ ๊ธฐ๋ฅ ์ง์
๋ฌธ์์ด ๊ธฐ๋ฐ ์ฟผ๋ฆฌ๋ก ์ธํ ํ์
์์ ์ฑ ๋ถ์กฑ
๋ฐํ์ ์์ ์ ์ค๋ฅ ๋ฐ๊ฒฌ
IDE์ ์๋ ์์ฑ ์ง์์ด ์ ํ์
์์ ์ฌ์ฉ: ๋ฐ๋ณต๋๋ JPQL ๋ฌธ์์ด์ ์์๋ก ์ ์ํ์ฌ ๊ด๋ฆฌ
public class JPQLConstants {
public static final String FIND_BY_USERNAME = "SELECT u FROM User u WHERE u.username = :username";
}
๋ค์๋ ์ฟผ๋ฆฌ ํ์ฉ: ์์ฃผ ์ฌ์ฉ๋๋ ์ฟผ๋ฆฌ๋ ์ํฐํฐ ํด๋์ค์ @NamedQuery๋ก ์ ์
@Entity
@NamedQuery(name = "User.findByUsername", query = "SELECT u FROM User u WHERE u.username = :username")
public class User { ... }
ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ์ฌ์ฉ: SQL ์ธ์ ์ ๋ฐฉ์ง๋ฅผ ์ํด ํญ์ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ์ฌ์ฉ
ํ ์คํธ ์์ฑ: JPQL ์ฟผ๋ฆฌ์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ์ค๋ฅ ์กฐ๊ธฐ ๋ฐ๊ฒฌ
QueryDSL ๊ณ ๋ ค: ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ํ์ ์์ ํ QueryDSL ์ฌ์ฉ ๊ฒํ