Spring/Spring JPA ๊ธฐ๋ณธ

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 13. JPQL ๊ธฐ๋ณธ ๋ฌธ๋ฒ• / ์ฟผ๋ฆฌ API

hello_u 2023. 3. 4. 14:59

 

JPQL - ๊ธฐ๋ณธ ๋ฌธ๋ฒ•๊ณผ ๊ธฐ๋Šฅ

 

์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌํ•˜๋Š” ๊ฒƒ 

 

JPQL ์€ ๊ฒฐ๊ตญ SQL๋กœ ๋ณ€ํ™˜๋œ๋‹ค. 

 

"select m From Member m where m.age > 18"

 

์—”ํ‹ฐํ‹ฐ์™€ ์†์„ฑ์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. ( Member , age ) 

 

JPQL ํ‚ค์›Œ๋“œ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค ( SELECT , FROM , where ) 

 

JPQL ์€ ํ…Œ์ด๋ธ” ์ด๋ฆ„์ด ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค. ( Member ) 

 

๋ณ„์นญ์€ ํ•„์ˆ˜์ด๋‹ค. ( Member as m ) as ๋Š” ์ƒ๋žต๊ฐ€๋Šฅํ•˜๋‹ค . 

 

 

 

TypeQuery, Query

 

TypedQuery<Member> query1 = em.createQuery("select m from Member m ", Member.class);

TypeQuey : ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋ช…ํ™•ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

Query query2 = em.createQuery("select m.username, m.age from Member m");

Query : ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

 

 

๊ฒฐ๊ณผ ์กฐํšŒ API

query.getResultList();

 

getResultList() : ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์ผ ๋•Œ , ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

 

( NPE ๊ฑฑ์ •ํ•  ํ•„์š” ์—†๋‹ค ) 

 

 

query.getSingleResult();

 

getSingleResult() : ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํžˆ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค . ๋‹จ์ผ ๊ฐ์ฒด ๋ฐ˜ํ™˜

 

๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด javax.persistence.NoResultException

 

๋‘˜ ์ด์ƒ์ด๋ฉด javax.persistence.NonUniqueResultException

 

 

 

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ

em.createQuery("select m from Member m where m.username = :username", Member.class)
        .setParameter("username","member1")
        .getSingleResult();

 

 ์ฟผ๋ฆฌ์— ์ž‘์„ฑ๋˜๋Š” ํŠน์ • ์†์„ฑ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

 ์ด๋ฆ„ ๊ธฐ์ค€ ๋ฐ”์ธ๋”ฉ์€ =: ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 

ํ”„๋กœ์ ์…˜(SELECT)

 

SELECT ์ ˆ์— ์กฐํšŒํ•  ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

ํ”„๋กœ์ ์…˜์˜ ๋Œ€์ƒ 

 

์—”ํ‹ฐํ‹ฐ ํ”„๋กœ์ ์…˜

SLECET m FROM Member m

 

์—”ํ‹ฐํ‹ฐ ํ”„๋กœ์ ์…˜ 

SLECET m.team FROM Member m

 

 ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… ํ”„๋กœ์ ์…˜ 

SLECET m.address FROM Member m

 

 ์Šค์นผ๋ผ ํƒ€์ž… ํ”„๋กœ์ ์…˜ ( ์ˆซ์ž, ๋ฌธ์ž๋“ฑ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž… ) 

SLECET m.username, m.age FROM Member m

 

 

DISTINCT ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

SELECT DISTINCT m.username FROM Member m

 

 

 ์—ฌ๋Ÿฌ๊ฐ’ ์กฐํšŒ

Query query = em.createQuery("select m.username, m.age from Member m");

 

์—ฌ๋Ÿฌ๊ฐ’์œผ๋กœ ์กฐํšŒํ–ˆ์„ ๋•Œ๋Š” TypedQuery๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , Query๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

List<Object[]> resultList = query.getResultList();

for(Object[] row : resultList){
    String username = (String)row[0];
    Integer age = (Integer)row[1];
    Team team = (Team)row[2];
}

 

Object[] ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

 

 

TypedQuery<UserDTO> query =
        em.createQuery("SELECT NEW com.joont.dto.UserDTO(m.username, m.age, m.team) FROM Member m", UserDTO.class);

List<UserDTO> resultList = query.getResultList();

 

NEW ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Object[] ๋Œ€์‹  ๋ฐ”๋กœ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•ด์„œ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

  • ํŒจํ‚ค์ง€๋ช…์„ ํฌํ•จํ•œ ํด๋ž˜์Šค๋ช…์„ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
  • ์ˆœ์„œ์™€ ํƒ€์ž…์ด ์ผ์น˜ํ•˜๋Š” ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

 

 

 

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

JPA๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ฑฐ๋‚˜, ์‹ค๋ฌด์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ€์กฑํ•˜์‹  ๋ถ„๋“ค์ด JPA์˜ ๊ธฐ๋ณธ ์ด๋ก ์„ ํƒ„ํƒ„ํ•˜๊ฒŒ ํ•™์Šตํ•ด์„œ ์ดˆ๋ณด์ž๋„ ์‹ค๋ฌด์—์„œ ์ž์‹ ์žˆ๊ฒŒ JPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ

www.inflearn.com