В общем случае вы можете указать несколько параметров для вложенного выбора для ассоциации или коллекции.
Если бы параметры query
были простой строкой (а не перечислением), вы можете добавить столбец к основному запросу, который возвращает список видео, например:
select id, title, ..., 'ACTORS_BY_FILM' query_type
from video
Затем вы изменяете отображение для коллекции:
<collection property="actors" javaType="HashSet" ofType="Person" column="{id=id,query=query_type}"
select="ru.common.mapper.PersonMapper.getByFilmId">
Таким образом, столбцы id
и query_type
из основного запроса будут переданы как параметры для вложенного выбора.
В вашем случае вам нужно, чтобы mybatis вызывал конструктор для переданного строкового параметра, и я не думаю, что mybatis это поддерживает.
Один из способов, которым вы можете попытаться преодолеть это. Я не уверен, что это сработает, поскольку вы уже находитесь на серой территории, когда используете двойную замену. Я бы сказал, что это не намеренное поведение mybatis.
Но вы можете попробовать. Так что измените метод маппера, чтобы он принимал строку.
Затем вы можете создать вспомогательный статический метод, который преобразует имя запроса в текст запроса:
public class PersonByFilmQueryBuilder {
public static String getQuery(String queryId) {
return PersonByFilmQueries.valueOf(queryId);
}
}
Теперь вы можете использовать этот статический метод в выражении OGNL в select следующим образом:
@Select("${@com.mycompany.myapp.PersonByFilmQueryBuilder@getQuery(query)}")
Set<Person> getByFilmId(@Param("id") long id, @Param("query") String query);
Я не совсем уверен, что на этом этапе генерации запросов mybatis использует полнофункциональное выражение OGNL. Если это произойдет, это будет работать.