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