Expressions

Kotlin JDSL์€ JPQL์˜ expression๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Expression ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Alias

Expression์˜ as()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ Expression์— alias๋ฅผ ๊ฑธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. expression()์„ ์ด์šฉํ•˜๋ฉด Expression์˜ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ๋Š” alias๋ฅผ ํ†ตํ•ด์„œ ๊ตฌ๋ถ„๋˜๋ฉฐ ๋™์ผํ•œ alias๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Expression์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Expression์— alias๋ฅผ ๊ฑธ๊ณ  alias๊ฐ€ ๊ฑธ๋ฆฐ Expression์„ ๋‹ค๋ฅธ clause์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

val bookPrice = expression(BigDecimal::class, "price")

select(
    path(Book::price)(BookPrice::value).`as`(bookPrice)
).from(
    entity(Book::class)
).where(
    bookPrice.eq(BigDecimal.valueOf(100))
)

// OR

select(
    path(Book::price)(BookPrice::value).`as`(expression("price"))
).from(
    entity(Book::class)
).where(
    expression(BigDecimal::class, "price").eq(BigDecimal.valueOf(100))
)

Type Cast

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” Expression์˜ ํƒ€์ž…์„ ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Kotlin JDSL์€ as()๋ฅผ ํ†ตํ•ด์„œ unsafe type casting์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

circle-info

This is a shortened form of as Expression<T>, so it may not work as expected.

Arithmetic operations

์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • + (plus)

  • - (minus)

  • * (times)

  • / (div)

Parentheses

ํ™•์žฅ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž์— ์—ฐ์‚ฐ ์ˆœ์„œ๋ฅผ ์œ„ํ•œ ์†Œ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์—ฐ์‚ฐ ์ˆœ์„œ๊ฐ€ ๋ชจํ˜ธํ•ด์„œ ์†Œ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Values

๊ฐ’์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, value()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ’์€ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์น˜ํ™˜๋˜๋ฉฐ, ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

circle-info

๋งŒ์•ฝ KClass๊ฐ€ value()์— ์ „๋‹ฌ๋˜๋ฉด ์ด๋Š” Entity๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค.

Params

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, value() ๋Œ€์‹  param()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. param()์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Literals

literal์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, value() ๋Œ€์‹  xxxLiteral()์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

circle-info

string literal์„ ์ถœ๋ ฅํ•  ๋•Œ ๋งŒ์•ฝ '(์ž‘์€ ๋”ฐ์˜ดํ‘œ)๊ฐ€ ์žˆ์œผ๋ฉด '(์ž‘์€ ๋”ฐ์˜ดํ‘œ)๋Š” ''(์ž‘์€ ๋”ฐ์˜ดํ‘œ 2๊ฐœ)๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋กœ 'literal''s' ์ฒ˜๋Ÿผ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

Type
Function
Rendered

Int

intLiteral

{value}

Long

longLiteral

{value}L

Float

floatLiteral

{value}F

Double

doubleLiteral

{value}

Boolean

booleanLiteral

TRUE or FALSE

Char

charLiteral

'{value}'

String

stringLiteral

'{value}'

Enum

enumLiteral

{qualified name}.{enum name}

Aggregation functions

์ง‘ํ•ฉ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, ๋‹ค์Œ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • COUNT (count)

  • MIN (min)

  • MAX (max)

  • AVG (avg)

  • SUM (sum)

Sum

sum()์€ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Type
Return Type

Int

Long

Long

Long

Float

Double

Double

Double

BigInteger

BigInteger

BigDecimal

BigDecimal

Functions

Kotlin JDSL์€ JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋“ค์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

String functions

  • CONCAT (concat)

  • SUBSTRING (substring)

  • TRIM (trim)

  • LOWER (lower)

  • UPPER (upper)

  • LENGTH (length)

  • LOCATE (locate)

  • CAST (cast) - JPA 3.2์— ์ถ”๊ฐ€๋จ

  • LEFT (left) - JPA 3.2์— ์ถ”๊ฐ€๋จ

  • RIGHT (right) - JPA 3.2์— ์ถ”๊ฐ€๋จ

  • REPLACE (replace) - JPA 3.2์— ์ถ”๊ฐ€๋จ

Arithmetic functions

  • ABS (abs)

  • CEILING (ceiling)

  • EXP (exp)

  • FLOOR (floor)

  • INDEX (index)

  • LN (ln)

  • MOD (mod)

  • POWER (power)

  • SIGN (sign)

  • SQRT (sqrt)

  • ROUND (round)

  • SIZE (size)

Datetime functions

  • CURRENT_DATE (currentDate)

  • CURRENT_TIME (currentTime)

  • CURRENT_TIMESTAMP (currentTimestamp)

  • LOCAL DATE (localDate)

  • LOCAL TIME (localTime)

  • LOCAL DATETIME (localDateTime)

Database function

DB ํ•จ์ˆ˜๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, function()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

circle-info

์‚ฌ์šฉํ•  ํ•จ์ˆ˜์˜ ์ •๋ณด๋ฅผ JPA ์ œ๊ณต์ž์— ๋“ฑ๋กํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Hibernate๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด FunctionContributor๋ฅผ ๋ฐ˜๋“œ์‹œ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Cases

case๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, caseWhen()๊ณผ caseValue()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Coalesce

coalesce๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, coalesce()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NullIf

nullIf๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, nullIf()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

New

DTO ํ”„๋กœ์ ์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, new()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Type

type ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, type()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Custom expression

์ปค์Šคํ…€ expression์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, customExpression()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ customExpression()์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‚˜๋งŒ์˜ DSL์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

ID

์—”ํ‹ฐํ‹ฐ์˜ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” JPA 3.2์—์„œ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” Entity ๋˜๋Š” ๋‹จ์ผ ๊ฐ’ ์—”ํ‹ฐํ‹ฐ๋กœ ๊ท€๊ฒฐ๋˜๋Š” ๊ฒฝ๋กœ ํ‘œํ˜„์‹(single_valued_object_path_expression)์„ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ์‹๋ณ„์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

VERSION

์—”ํ‹ฐํ‹ฐ์˜ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” JPA 3.2์—์„œ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” Entity ๋˜๋Š” ๋ฒ„์ „ ๋งคํ•‘์ด ์žˆ๋Š” ๋‹จ์ผ ๊ฐ’ ์—”ํ‹ฐํ‹ฐ๋กœ ๊ท€๊ฒฐ๋˜๋Š” ๊ฒฝ๋กœ ํ‘œํ˜„์‹์„ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ๋ฒ„์ „์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Last updated