JPQL part3

๋‹คํ˜•์„ฑ ์ฟผ๋ฆฌ

JPQL๋กœ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ฒŒ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค

๋‹ค์–‘ํ•œ ํƒ€์ž…์ด ์กด์žฌํ•˜๊ณ  ํฌ๊ฒŒ๋กœ๋Š” TYPE - ์—”ํ‹ฐํ‹ฐ์˜ ์ƒ์† ์ˆ˜์กฐ์—์„œ ์กฐํšŒ ๋Œ€์ƒ์„ ํŠน์ • ์ž์‹ ํƒ€์ž…์œผ๋กœ ํ•œ์ •ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ TREAT - ์ƒ์† ๊ตฌ์กฐ์—์„œ ๋ถ€๋ชจ ํƒ€์ž…์„ ํŠน์ • ์ž์‹ ํƒ€์ž…์œผ๋กœ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ

์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ

๋ฌธ๋ฒ•

function_invocation::=FUNCTION(function_name {, function_arg}*)

ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฉ์–ธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์‚ฌ์šฉํ•  ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด์•ผํ•จ

๊ธฐํƒ€ ์ •๋ฆฌ

enum์€ = ๋น„๊ต์—ฐ์‚ฐ๋งŒ ์ง€์› ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ๋น„๊ต๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ

Empty String

JPAํ‘œ์ค€์—์„œ๋Š” ''์„ ๊ธธ์ด 0์ธ Empty String์œผ๋กœ ์ง€์ •ํ•ด๋‘์—ˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ''์„ null๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋„ ์กด์žฌ

Null ์ •์˜

์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด null null๊ฐ’์˜ ์˜๋ฏธ๋Š” unknownvalue์ด๋‹ค -> ๋”ฐ๋ผ์„œ null๊ณผ ์ด๋ฃจ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜ํ•™์  ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋Š” null null == null ์€ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๋‹ค null IS NULL ์€ true์ด๋‹ค

์—”ํ‹ฐํ‹ฐ ์ง์ ‘ ์‚ฌ์šฉ

๊ธฐ๋ณธ ํ‚ค ๊ฐ’

๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋Š” ์ฐธ์กฐ ๊ฐ’์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ํ…Œ์ด๋ธ” ๋กœ์šฐ๋Š” ๊ธฐ๋ณธ ํ‚ค๊ฐ’์œผ๋กœ ์‹๋ณ„ํ•œ๋‹ค ๋”ฐ๋ผ์„œ JPQL์—์„œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด SQL์—์„œ๋Š” ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ์˜ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์„ ์‚ฌ์šฉ

select count(m.id) from Member m;
select count(m) from Member m;

์ฒซ ๋ฒˆ์งธ ์ค„์€ m.id๋ฅผ ๊ธฐ์ค€(๊ธฐ๋ณธํ‚ค)์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š”๊ฑฐ์ง€๋งŒ ๋‘ ๋ฒˆ์จฐ ์ค„์€ m๋ฅผ ๊ธฐ์ค€(์—”ํ‹ฐํ‹ฐ)์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฑด๋ฐ, ์‚ฌ์‹ค ์‹ค์ œ๋กœ sql๋ฌธ์ด ์‹คํ–‰๋œ ๊ฒƒ์„ ํ™•์ธํ•ด๋ณด๋ฉด ๋‘˜ ๋‹ค ๋ชจ๋‘ ์—”ํ‹ฐํ‹ฐ์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ

String qlString = "select m from Member m where m = :member";
List resultList = em.createQuery(qlString).setParameter("member", member).getResultList();

์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ

String qlString = "select m from Member m where m.id = :memberId";
List resultList = em.createQuery(sqlString).setParameter("memberId", 4L).getResultList();

์ด ๋‘˜์˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฑฐ..!

์™ธ๋ž˜ ํ‚ค ๊ฐ’

์ด๋ฒˆ์—” ์™ธ๋ž˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ด๋ณด์ž ์ผ๋‹จ ๊ทธ๋ƒฅ ๋‹จ์ˆœํ•˜๊ฒŒ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™์ด ๋ณด์ž

Team team = em.find(Team.class, 1L);

String qlString = "select m from Member m where m.team = :team";
List resultList = em.createQuery(q1String).setParameter("team", team).getResultList();

์ด๋ฒˆ์—” ์™ธ๋ž˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

String q1String = "select m from Member m where m.team.id = :teamId;"
List resultList = em.createQuery(q1String).setParameter("teamId", 1L).getResultList();

m.team.id๋ผ๋Š” ์˜๋ฏธ๋Š” team๊ณผ member๊ฐ€ ์กฐ์ธ์ด ์ผ์–ด๋‚˜์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ์‚ฌ์‹ค ์ด๋ฏธ member ํ…Œ์ด๋ธ”์„œ team_id๋ฅผ ์™ธ๋ž˜ํ‚ค ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋–„๋ฌธ์— ์‹ค์ œ๋กœ ์กฐ์ธ์ด ์ผ์–ด๋‚˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋ฌผ๋ก  m.team.name๋ง‰ ์ด๋ ‡๊ฒŒ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฐ’์„ ์กฐํšŒํ•œ๋‹ค๋ฉด ์กฐ์ธ์€ ์ผ์–ด๋‚œ๋‹ค ๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์ ์œผ๋กœ m.team.id๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์กฐ์ธ์€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š”์ 

Named ์ฟผ๋ฆฌ

JPQL ์ฟผ๋ฆฌ๋Š” ํฌ๊ฒŒ ๋™์  ์ฟผ๋ฆฌ, ์ •์  ์ฟผ๋ฆฌ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค

  • ๋™์  ์ฟผ๋ฆฌ : em.createQuery์ฒ˜๋Ÿผ jpql์„ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค์–ด์„œ ์ „์†กํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

  • ์ •์  ์ฟผ๋ฆฌ : ๋ฏธ๋ฆฌ ์ •์˜ํ•œ ์ฟผ๋ฆฌ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด์„œ ํ•„์š”ํ•  ๋–„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๊ณ  ํ•œ ๋ฒˆ ์ •์˜ํ•˜๋ฉด ๋‹ค์‹œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ

Named ์ฟผ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ์ ์— jpql์„ ์ฒดํฌํ•˜๊ณ  ๋ฏธ๋ฆฌ ํŒŒ์‹ฑํ•ด๋‘๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฏธ๋ฆฌ ํŒŒ์‹ฑํ•ด๋‘” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ๋„ ๋น ๋ฅด๋ฉฐ ์ •์  sql์ด ์ƒ์„ฑ๋จ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋„ ์ž˜ ๋œ๋‹ค ๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ญ๋ƒ -> ์• ๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ •์˜

์ฝ”๋“œ๋กœ ๋ณด์ž

@Entity
@NamedQuery(
    name = "Member.findByUsername",
    query = "select m from Member m where m.username = :username")
)
public class Member{
    ...
}

์ด๋ ‡๊ฒŒ ์„ ์–ธํ•ด๋‘๊ณ  ์‹ค์ œ ์‚ฌ์šฉ์€

List<Member> resultList = em.createNamedQeury("Member.findByUsername", Member.class)
                                .setParameter("username", "ํšŒ์›1")
                                .getResultList();

๋งŒ์•ฝ์˜ ๋‘ ๊ฐœ ์ด์ƒ์˜ namedquery๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด @NamedQueries({@NamedQuery, ... }) ์ด๋ ‡๊ฒŒ ๋‚ด๋ถ€์— ์ง‘์–ด๋„ฃ๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅ

Last updated

Was this helpful?