naver/spring-jdbc-plus

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을 사용해 처리하였습니다.

다시 한번 감사합니다^^