Paths
Kotlin JDSL์ JPQL์ path expression์ ํํํ๊ธฐ ์ํด์ Path
์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. Path
๋ฅผ ๋ง๋ค๊ธฐ ์ํด, path()
์ invoke()
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// Book.isbn.value
path(Book::isbn).path(Isbn::value)
path(Book::isbn)(Isbn::value)
// b.isbn.value
entity(Book::class, "b").path(Book::isbn).path(Isbn::value)
entity(Book::class, "b")(Book::isbn)(Isbn::value)
Java entity
path()
์ invoke()
๋ KProperty1
๋๋ KFuction1
๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. KFunction1
์ ๊ฒฝ์ฐ, getter๋ง public์ธ Java๋ก ์ ์ธํ entity๋ฅผ ์ฌ์ฉํ ๋ ์ ์ฉํฉ๋๋ค.
@Entity
public class Book {
@Id
private Long id;
private String title;
public String getTitle() {
return title;
}
}
// compile error
path(Book::title)
// Book.title
path(Book::getTitle)
Kotlin JDSL์ getter ์ด๋ฆ์์ ํ๋กํผํฐ ์ด๋ฆ์ ์ถ๋ก ํ๊ธฐ ์ํด ๋ค์ ๊ท์น์ ๋ฐ๋ฆ ๋๋ค.
is
๋ก ์์ํ๋ ๊ฒฝ์ฐ ์ด๋ฆ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.get
์ผ๋ก ์์ํ๋ ๊ฒฝ์ฐget
์ ์ ๊ฑฐํ๊ณ ์ดํ ์ฒซ ๊ธ์๋ฅผ ์๋ฌธ์๋ก ๋ณ๊ฒฝํฉ๋๋ค.๊ทธ ์ธ์ ๊ฒฝ์ฐ, ์ด๋ฆ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.
// Book.isAvailable
path(Book::isAvailable)
// Book.available
path(Book::getAvailable)
์ ๊ท์น ๋์ ๋๋ง์ ๊ท์น์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, JpqlPropertyIntrospector
๋ฅผ ๊ตฌํํ๊ณ ์ด๋ฅผ ์ด๋ฅผ RenderContext
์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋ ์์ธํ ๋ด์ฉ์ Custom DSL์ ์ฐธ๊ณ ํ์ธ์. Spring์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด Spring supports๋ ์ฐธ๊ณ ํ์ธ์.
class MyIntrospector : JpqlPropertyIntrospector() {
override fun introspect(property: KCallable<*>): JpqlPropertyDescription? {
if (property is KFunction1<*, *>) {
// ๋๋ง์ ๊ท์น์ผ๋ก ์ด๋ฆ์ ์ถ๋ก ํฉ๋๋ค
val name = ...
return MyProperty(name)
}
return null
}
private data class MyProperty(
override val name: String,
) : JpqlPropertyDescription
}
val myModule = object : JpqlRenderModule {
override fun setupModule(context: JpqlRenderModule.SetupContext) {
context.prependIntrospector(MyIntrospector())
}
}
val myContext = JpqlRenderContext().registerModule(myModule)
Expression
Path
๋ select clause ๋ predicate ๋ฑ์์ Expression
์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
// SELECT Book.isbn FROM Book AS Book WHERE Book.isbn.value = :param1
jpql {
select(
path(Book::isbn),
).from(
entity(Book::class),
).where(
path(Book::isbn)(Ibsn::value).eq("01"),
)
}
Treat
Path
์ ํ์
์ ์์ ํ์
์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด, treat()
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
path(EmployeeDepartment::employee).treat(FullTimeEmployee::class)
Last updated