Skip to content

Commit 6ad95ae

Browse files
committed
DATAJPA-1064 - Avoid nulls in PartTreeJpaQuery.
1 parent 3da91e9 commit 6ad95ae

File tree

1 file changed

+20
-17
lines changed

1 file changed

+20
-17
lines changed

src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.data.jpa.repository.query.ParameterMetadataProvider.ParameterMetadata;
3232
import org.springframework.data.repository.query.ParametersParameterAccessor;
3333
import org.springframework.data.repository.query.ResultProcessor;
34+
import org.springframework.data.repository.query.ReturnedType;
3435
import org.springframework.data.repository.query.parser.PartTree;
3536

3637
/**
@@ -98,9 +99,9 @@ public TypedQuery<Long> doCreateCountQuery(Object[] values) {
9899
@Override
99100
protected JpaQueryExecution getExecution() {
100101

101-
if(this.tree.isDelete()) {
102+
if (this.tree.isDelete()) {
102103
return new DeleteExecution(em);
103-
} else if(this.tree.isExistsProjection()) {
104+
} else if (this.tree.isExistsProjection()) {
104105
return new ExistsExecution();
105106
}
106107

@@ -123,7 +124,7 @@ public QueryPreparer(PersistenceProvider persistenceProvider, boolean recreateQu
123124

124125
this.persistenceProvider = persistenceProvider;
125126

126-
JpaQueryCreator creator = createCreator(null, persistenceProvider);
127+
JpaQueryCreator creator = createCreator(persistenceProvider, Optional.empty());
127128

128129
this.cachedCriteriaQuery = recreateQueries ? null : creator.createQuery();
129130
this.expressions = recreateQueries ? null : creator.getParameterExpressions();
@@ -142,7 +143,7 @@ public Query createQuery(Object[] values) {
142143
ParametersParameterAccessor accessor = new ParametersParameterAccessor(parameters, values);
143144

144145
if (cachedCriteriaQuery == null || accessor.hasBindableNullValue()) {
145-
JpaQueryCreator creator = createCreator(accessor, persistenceProvider);
146+
JpaQueryCreator creator = createCreator(persistenceProvider, Optional.of(accessor));
146147
criteriaQuery = creator.createQuery(getDynamicSort(values));
147148
expressions = creator.getParameterExpressions();
148149
}
@@ -178,7 +179,7 @@ private Query restrictMaxResultsIfNecessary(Query query) {
178179
query.setMaxResults(tree.getMaxResults());
179180
}
180181

181-
if(tree.isExistsProjection()) {
182+
if (tree.isExistsProjection()) {
182183
query.setMaxResults(1);
183184
}
184185

@@ -204,19 +205,21 @@ private TypedQuery<?> createQuery(CriteriaQuery<?> criteriaQuery) {
204205
return getEntityManager().createQuery(criteriaQuery);
205206
}
206207

207-
protected JpaQueryCreator createCreator(ParametersParameterAccessor accessor,
208-
PersistenceProvider persistenceProvider) {
208+
protected JpaQueryCreator createCreator(PersistenceProvider persistenceProvider,
209+
Optional<ParametersParameterAccessor> accessor) {
209210

210211
EntityManager entityManager = getEntityManager();
211212
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
212213

213-
ParameterMetadataProvider provider = accessor == null
214-
? new ParameterMetadataProvider(builder, parameters, persistenceProvider)
215-
: new ParameterMetadataProvider(builder, accessor, persistenceProvider);
214+
ParameterMetadataProvider provider = accessor
215+
.map(it -> new ParameterMetadataProvider(builder, it, persistenceProvider))//
216+
.orElseGet(() -> new ParameterMetadataProvider(builder, parameters, persistenceProvider));
216217

217-
ResultProcessor resultFactory = getQueryMethod().getResultProcessor().withDynamicProjection(Optional.ofNullable(accessor));
218+
ResultProcessor processor = getQueryMethod().getResultProcessor();
219+
ReturnedType returnedType = accessor.map(it -> processor.withDynamicProjection(it))//
220+
.orElse(processor).getReturnedType();
218221

219-
return new JpaQueryCreator(tree, resultFactory.getReturnedType(), builder, provider);
222+
return new JpaQueryCreator(tree, returnedType, builder, provider);
220223
}
221224

222225
/**
@@ -259,15 +262,15 @@ public CountQueryPreparer(PersistenceProvider persistenceProvider, boolean recre
259262
* @see org.springframework.data.jpa.repository.query.PartTreeJpaQuery.QueryPreparer#createCreator(org.springframework.data.repository.query.ParametersParameterAccessor, org.springframework.data.jpa.provider.PersistenceProvider)
260263
*/
261264
@Override
262-
protected JpaQueryCreator createCreator(ParametersParameterAccessor accessor,
263-
PersistenceProvider persistenceProvider) {
265+
protected JpaQueryCreator createCreator(PersistenceProvider persistenceProvider,
266+
Optional<ParametersParameterAccessor> accessor) {
264267

265268
EntityManager entityManager = getEntityManager();
266269
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
267270

268-
ParameterMetadataProvider provider = accessor == null
269-
? new ParameterMetadataProvider(builder, parameters, persistenceProvider)
270-
: new ParameterMetadataProvider(builder, accessor, persistenceProvider);
271+
ParameterMetadataProvider provider = accessor
272+
.map(it -> new ParameterMetadataProvider(builder, it, persistenceProvider))//
273+
.orElseGet(() -> new ParameterMetadataProvider(builder, parameters, persistenceProvider));
271274

272275
return new JpaCountQueryCreator(tree, getQueryMethod().getResultProcessor().getReturnedType(), builder, provider);
273276
}

0 commit comments

Comments
 (0)