Итак, 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.
, и я не могу найти ничего на соответствующих документах .