raw literal string을 사용하는 경우 동적 쿼리 적용 방법 문의
digimon1740 opened this issue · 2 comments
이번에 Spring Data JDBC를 선택하면서 https://github.com/benelog/entity-dev/blob/master/src/index.adoc 를 보면서 SQL관리방안을 그대로 적용해보고 있습니다.
사용 중인 언어는 코틀린이고 github예제 처럼 raw literal string을 사용하고 있어서 아래와 같은 형태로 적용하면 문제가 없지만
object ContentSqls {
const val selectById =
"""
SELECT *
FROM contents
WHERE c.id = :id
AND deleted_at IS NOT NULL
"""
}
interface ContentRepository : CrudRepository<Content, Long> {
@Query(ContentSqls.selectById)
fun selectById(id: Long): Content?
}
아래와 같이 동적 쿼리를 적용을 하고 싶은데
object ContentSqls {
fun selectById(id:Long) =
"""
SELECT *
FROM contents
${
if (id != null) {
"""
WHERE id = :id
AND deleted_at IS NOT NULL
""".trimIndent()
} else {
"""
""".trimIndent()
}
}
"""
}
interface ContentRepository : CrudRepository<Content, Long> {
@Query(ContentSqls.selectById)
fun selectById(id: Long): Content?
}
@Query
애노테이션 내부에선 메서드가 상수타임에 생성되는것이 아니라 에러가 발생합니다.
이런 경우 어떤식으로 쿼리 메서드를 적용할 수 있는지 궁금합니다.
@digimon1740
이슈 작성하신 후에 방법이 없는걸 아시고 닫으셨을거라 생각됩니다.
애노테이션에 상수가 아닌 fun 을 호출할 수 없어서 에러가 나는거 같습니다.
@query 에 SQL 을 작성할려면 상수 (const val) 를 넘겨야 될거 같고 동적 쿼리는 작성이 힘들거 같습니다.
Spring Data JDBC 에 아래와 같이 SPEL 을 적용할 수 있는 PR 이 올라왔는데 만약 반영된 다면 동적 쿼리 작성도 가능할거 같긴합니다.
spring-projects/spring-data-relational#229
@mhyeon-lee 님
친절하게 답변해주셔서 감사합니다. 제가 올린 이슈가 해당 spring-jdbc-plus 프로젝트의 이슈의 성격과 다르다고 생각되어 closed하였습니다.
동적 쿼리 fun의 경우@query는 사용하지 않고 예제 코드를 참고하여 NamedParameterJdbcTemplate을 사용해 처리하였습니다.
다시 한번 감사합니다^^