0

I'm using spring-boot-starter-data-jdbc and infobip-spring-data-jdbc-querydsl-boot-starter(5.4.2) together. In my tests with org.springframework.transaction.annotation.Transactional annotation I have the following code:

@Transactional
void test() {
    repository.save(ReportList.builder().userName("username").build());

    var reports = repository.query(query -> query
            .select(entityProjection())
            .from(QReportList.reportList)
            .fetch());
}

Expected result: variable reports is not empty Actual result: variable reports is empty

If I remove @Transactional (or use default findAll method from QuerydslJdbcRepository) it starts to return results. Am I doing something wrong?

4

1 回答 1

0

经过一段时间的挖掘,我发现了以下代码行:

public class SQLQueryFactory extends AbstractSQLQueryFactory<SQLQuery<?>> {

    static class DataSourceProvider implements Provider<Connection> {

        @Override
        public Connection get() {
            try {
                return ds.getConnection();
            } catch (SQLException e) {
                throw new RuntimeException(e.getMessage(), e);
            }
        }
    }

ds.getConnection()返回新连接而不是现有连接(带有事务)。

我添加querydsl-sql-spring了以下配置,我的代码开始按预期工作:

@Bean
public SQLQueryFactory queryFactory(com.querydsl.sql.Configuration configuration, DataSource dataSource) {
   var provider = new SpringConnectionProvider(dataSource);
   return new SQLQueryFactory(configuration, provider);
}
于 2022-01-10T09:38:43.527 回答