|
|
|
@ -62,6 +62,7 @@ import org.springframework.util.Assert; |
|
|
|
* @author Chirag Tailor |
|
|
|
* @author Chirag Tailor |
|
|
|
* @author Diego Krupitza |
|
|
|
* @author Diego Krupitza |
|
|
|
* @author Sergey Korotaev |
|
|
|
* @author Sergey Korotaev |
|
|
|
|
|
|
|
* @author Mikhail Polivakha |
|
|
|
* @since 1.1 |
|
|
|
* @since 1.1 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
@ -73,6 +74,8 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
private final SqlParametersFactory sqlParametersFactory; |
|
|
|
private final SqlParametersFactory sqlParametersFactory; |
|
|
|
private final InsertStrategyFactory insertStrategyFactory; |
|
|
|
private final InsertStrategyFactory insertStrategyFactory; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final QueryMappingConfiguration queryMappingConfiguration; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Creates a {@link DefaultDataAccessStrategy} |
|
|
|
* Creates a {@link DefaultDataAccessStrategy} |
|
|
|
* |
|
|
|
* |
|
|
|
@ -84,7 +87,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public DefaultDataAccessStrategy(SqlGeneratorSource sqlGeneratorSource, RelationalMappingContext context, |
|
|
|
public DefaultDataAccessStrategy(SqlGeneratorSource sqlGeneratorSource, RelationalMappingContext context, |
|
|
|
JdbcConverter converter, NamedParameterJdbcOperations operations, SqlParametersFactory sqlParametersFactory, |
|
|
|
JdbcConverter converter, NamedParameterJdbcOperations operations, SqlParametersFactory sqlParametersFactory, |
|
|
|
InsertStrategyFactory insertStrategyFactory) { |
|
|
|
InsertStrategyFactory insertStrategyFactory, QueryMappingConfiguration queryMappingConfiguration) { |
|
|
|
|
|
|
|
|
|
|
|
Assert.notNull(sqlGeneratorSource, "SqlGeneratorSource must not be null"); |
|
|
|
Assert.notNull(sqlGeneratorSource, "SqlGeneratorSource must not be null"); |
|
|
|
Assert.notNull(context, "RelationalMappingContext must not be null"); |
|
|
|
Assert.notNull(context, "RelationalMappingContext must not be null"); |
|
|
|
@ -92,6 +95,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
Assert.notNull(operations, "NamedParameterJdbcOperations must not be null"); |
|
|
|
Assert.notNull(operations, "NamedParameterJdbcOperations must not be null"); |
|
|
|
Assert.notNull(sqlParametersFactory, "SqlParametersFactory must not be null"); |
|
|
|
Assert.notNull(sqlParametersFactory, "SqlParametersFactory must not be null"); |
|
|
|
Assert.notNull(insertStrategyFactory, "InsertStrategyFactory must not be null"); |
|
|
|
Assert.notNull(insertStrategyFactory, "InsertStrategyFactory must not be null"); |
|
|
|
|
|
|
|
Assert.notNull(queryMappingConfiguration, "QueryMappingConfiguration must not be null"); |
|
|
|
|
|
|
|
|
|
|
|
this.sqlGeneratorSource = sqlGeneratorSource; |
|
|
|
this.sqlGeneratorSource = sqlGeneratorSource; |
|
|
|
this.context = context; |
|
|
|
this.context = context; |
|
|
|
@ -99,6 +103,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
this.operations = operations; |
|
|
|
this.operations = operations; |
|
|
|
this.sqlParametersFactory = sqlParametersFactory; |
|
|
|
this.sqlParametersFactory = sqlParametersFactory; |
|
|
|
this.insertStrategyFactory = insertStrategyFactory; |
|
|
|
this.insertStrategyFactory = insertStrategyFactory; |
|
|
|
|
|
|
|
this.queryMappingConfiguration = queryMappingConfiguration; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -272,7 +277,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
SqlIdentifierParameterSource parameter = sqlParametersFactory.forQueryById(id, domainType, ID_SQL_PARAMETER); |
|
|
|
SqlIdentifierParameterSource parameter = sqlParametersFactory.forQueryById(id, domainType, ID_SQL_PARAMETER); |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
return operations.queryForObject(findOneSql, parameter, getEntityRowMapper(domainType)); |
|
|
|
return operations.queryForObject(findOneSql, parameter, getRowMapper(domainType)); |
|
|
|
} catch (EmptyResultDataAccessException e) { |
|
|
|
} catch (EmptyResultDataAccessException e) { |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -280,13 +285,13 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> List<T> findAll(Class<T> domainType) { |
|
|
|
public <T> List<T> findAll(Class<T> domainType) { |
|
|
|
return operations.query(sql(domainType).getFindAll(), getEntityRowMapper(domainType)); |
|
|
|
return operations.query(sql(domainType).getFindAll(), getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> Stream<T> streamAll(Class<T> domainType) { |
|
|
|
public <T> Stream<T> streamAll(Class<T> domainType) { |
|
|
|
return operations.queryForStream(sql(domainType).getFindAll(), new MapSqlParameterSource(), |
|
|
|
return operations.queryForStream(sql(domainType).getFindAll(), new MapSqlParameterSource(), |
|
|
|
getEntityRowMapper(domainType)); |
|
|
|
getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -298,7 +303,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
|
|
|
|
|
|
|
|
SqlParameterSource parameterSource = sqlParametersFactory.forQueryByIds(ids, domainType); |
|
|
|
SqlParameterSource parameterSource = sqlParametersFactory.forQueryByIds(ids, domainType); |
|
|
|
String findAllInListSql = sql(domainType).getFindAllInList(); |
|
|
|
String findAllInListSql = sql(domainType).getFindAllInList(); |
|
|
|
return operations.query(findAllInListSql, parameterSource, getEntityRowMapper(domainType)); |
|
|
|
return operations.query(findAllInListSql, parameterSource, getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -311,7 +316,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
SqlParameterSource parameterSource = sqlParametersFactory.forQueryByIds(ids, domainType); |
|
|
|
SqlParameterSource parameterSource = sqlParametersFactory.forQueryByIds(ids, domainType); |
|
|
|
String findAllInListSql = sql(domainType).getFindAllInList(); |
|
|
|
String findAllInListSql = sql(domainType).getFindAllInList(); |
|
|
|
|
|
|
|
|
|
|
|
return operations.queryForStream(findAllInListSql, parameterSource, getEntityRowMapper(domainType)); |
|
|
|
return operations.queryForStream(findAllInListSql, parameterSource, getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -365,18 +370,18 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> List<T> findAll(Class<T> domainType, Sort sort) { |
|
|
|
public <T> List<T> findAll(Class<T> domainType, Sort sort) { |
|
|
|
return operations.query(sql(domainType).getFindAll(sort), getEntityRowMapper(domainType)); |
|
|
|
return operations.query(sql(domainType).getFindAll(sort), getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> Stream<T> streamAll(Class<T> domainType, Sort sort) { |
|
|
|
public <T> Stream<T> streamAll(Class<T> domainType, Sort sort) { |
|
|
|
return operations.queryForStream(sql(domainType).getFindAll(sort), new MapSqlParameterSource(), |
|
|
|
return operations.queryForStream(sql(domainType).getFindAll(sort), new MapSqlParameterSource(), |
|
|
|
getEntityRowMapper(domainType)); |
|
|
|
getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> List<T> findAll(Class<T> domainType, Pageable pageable) { |
|
|
|
public <T> List<T> findAll(Class<T> domainType, Pageable pageable) { |
|
|
|
return operations.query(sql(domainType).getFindAll(pageable), getEntityRowMapper(domainType)); |
|
|
|
return operations.query(sql(domainType).getFindAll(pageable), getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -386,7 +391,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
String sqlQuery = sql(domainType).selectByQuery(query, parameterSource); |
|
|
|
String sqlQuery = sql(domainType).selectByQuery(query, parameterSource); |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
return Optional.ofNullable(operations.queryForObject(sqlQuery, parameterSource, getEntityRowMapper(domainType))); |
|
|
|
return Optional.ofNullable(operations.queryForObject(sqlQuery, parameterSource, getRowMapper(domainType))); |
|
|
|
} catch (EmptyResultDataAccessException e) { |
|
|
|
} catch (EmptyResultDataAccessException e) { |
|
|
|
return Optional.empty(); |
|
|
|
return Optional.empty(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -398,7 +403,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
MapSqlParameterSource parameterSource = new MapSqlParameterSource(); |
|
|
|
MapSqlParameterSource parameterSource = new MapSqlParameterSource(); |
|
|
|
String sqlQuery = sql(domainType).selectByQuery(query, parameterSource); |
|
|
|
String sqlQuery = sql(domainType).selectByQuery(query, parameterSource); |
|
|
|
|
|
|
|
|
|
|
|
return operations.query(sqlQuery, parameterSource, getEntityRowMapper(domainType)); |
|
|
|
return operations.query(sqlQuery, parameterSource, getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -407,7 +412,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
MapSqlParameterSource parameterSource = new MapSqlParameterSource(); |
|
|
|
MapSqlParameterSource parameterSource = new MapSqlParameterSource(); |
|
|
|
String sqlQuery = sql(domainType).selectByQuery(query, parameterSource); |
|
|
|
String sqlQuery = sql(domainType).selectByQuery(query, parameterSource); |
|
|
|
|
|
|
|
|
|
|
|
return operations.queryForStream(sqlQuery, parameterSource, getEntityRowMapper(domainType)); |
|
|
|
return operations.queryForStream(sqlQuery, parameterSource, getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -416,7 +421,7 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
MapSqlParameterSource parameterSource = new MapSqlParameterSource(); |
|
|
|
MapSqlParameterSource parameterSource = new MapSqlParameterSource(); |
|
|
|
String sqlQuery = sql(domainType).selectByQuery(query, parameterSource, pageable); |
|
|
|
String sqlQuery = sql(domainType).selectByQuery(query, parameterSource, pageable); |
|
|
|
|
|
|
|
|
|
|
|
return operations.query(sqlQuery, parameterSource, getEntityRowMapper(domainType)); |
|
|
|
return operations.query(sqlQuery, parameterSource, getRowMapper(domainType)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -445,7 +450,13 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { |
|
|
|
return result; |
|
|
|
return result; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private <T> EntityRowMapper<T> getEntityRowMapper(Class<T> domainType) { |
|
|
|
private <T> RowMapper<? extends T> getRowMapper(Class<T> domainType) { |
|
|
|
|
|
|
|
RowMapper<? extends T> targetRowMapper; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((targetRowMapper = queryMappingConfiguration.getRowMapper(domainType)) != null) { |
|
|
|
|
|
|
|
return targetRowMapper; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return new EntityRowMapper<>(getRequiredPersistentEntity(domainType), converter); |
|
|
|
return new EntityRowMapper<>(getRequiredPersistentEntity(domainType), converter); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|