Недавно я попробовал новый инструмент для доступа к базе данных Querydsl в моем приложении Spring Boot, вот как я настраиваю контекст в @Configuration
классе:
@Bean
public com.querydsl.sql.Configuration querydslConfiguration() {
SQLTemplates templates = OracleTemplates.builder().build();
com.querydsl.sql.Configuration configuration = new com.querydsl.sql.Configuration(templates);
configuration.setExceptionTranslator(new SpringExceptionTranslator());
return configuration;
}
@Bean
public SQLQueryFactory queryFactory(DataSource dataSource) {
Provider<Connection> provider = new SpringConnectionProvider(dataSource);
return new SQLQueryFactory(querydslConfiguration(), provider);
}
Мой запрос довольно прост:
fun detailedEntityByIds(ids: Set<String>): List<DetailedEntity> {
val qDetails = QTContainerDetails.tContainerDetails
return sqlQueryFactory.select(qDetails).from(qDetails)
.where(qDetails.id.`in`(ids))
.fetch().map { mapper.qDslEntToModel(it) }
}
Тогда я столкнулся со следующим исключением:
java.lang.IllegalStateException: соединение не является транзакционным
Я быстро нашел этот вопрос: [QueryDSL / Spring] java.lang.IllegalStateException: Соединение не является транзакционным с рекомендацией использовать @Transactional
для решения этой проблемы.
Почему Querydsl требует, чтобы соединения были транзакционными? Раньше я ставил @Transactional
на методы уровня сервиса, где он мне действительно нужен. Теперь Querydsl «заставляет» меня поместить его в целый класс DAO, потому что похоже, что это требуется для каждого запроса Querydsl.