Как включить возвращаемые типы generi c в методах репозитория, аннотированных @ Query? - PullRequest
0 голосов
/ 20 апреля 2020

Итак, Spring поставляется с возможностью писать запросы к репозиторию, которые возвращают один из нескольких проекционных интерфейсов, позволяя передавать интерфейс обратно в репозиторий.

Например,

@Repository
interface FooRepository : ReadOnlyRepository<Foo, Int> {
    fun <T> findByBarId(barId: Int, type: Class<T>): List<T>
}

Мне сейчас нужно написать запрос, в котором довольно громоздко получить его по имени, поэтому я хочу использовать аннотацию @Query. Но я также хочу иметь возможность использовать проекционные интерфейсы.

Как мне это сделать? Наивная попытка

@Repository
interface FooRepository : ReadOnlyRepository<Foo, Int> {
    fun <T> findByBarId(barId: Int, type: Class<T>): List<T>


    @Query("""
        SELECT :T
           FROM Foo f
           WHERE f.barId = :barId AND ...
    """)
    fun <T> findByBarIdWhereSomeComplicatedCondition(@Param("barId") barId: Int, @Param("T") type: Class<T>): List<T>
}

терпит неудачу с

org.springframework.dao.InvalidDataAccessApiUsageException: Query argument T not found in the list of parameters provided during query execution.; nested exception is java.lang.IllegalStateException: Query argument T not found in the list of parameters provided during query execution.

, и я не могу найти ничего на соответствующих документах .

...