После исправления очевидных ошибок в вашем коде (без конструктора по умолчанию, примитив в аргументе типа) первые три метода выдают во время запуска приложения:
QuerySyntaxException: Unable to locate appropriate constructor on class [Person]. Expected arguments are: java.lang.String
Это потому, что конструктор принимает в качестве параметров только выражения выбора, а не узлы параметров, и это опущено. Добавление приведения к выражению решает вышеуказанную проблему, и код работает как ожидалось:
@Repository
interface PersonRepo extends CrudRepository<Person, Integer>{
@Query("SELECT new Person(cast(:age as int), person.name) FROM Person person")
List<Person> findAll(@Param("age") int age);
}
Приведенный выше подход является обходным путем, и это приводит к отправке аргумента в db в sql (пример на диалекте h2):
select cast(? as integer) as col_0_0_, person0_.name as col_1_0_ from person person0_
и зависит от функции приведения базы данных. Из-за этого вы не можете передать там составной тип (https://hibernate.atlassian.net/browse/HHH-9459)