Skip to content

Commit b881020

Browse files
committed
Hacking: Caching
1 parent 6b12da2 commit b881020

10 files changed

+196
-59
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HibernateJpaParametersParameterAccessor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class HibernateJpaParametersParameterAccessor extends JpaParametersParameterAcce
5151
* @param values must not be {@literal null}.
5252
* @param em must not be {@literal null}.
5353
*/
54-
HibernateJpaParametersParameterAccessor(Parameters<?, ?> parameters, Object[] values, EntityManager em) {
54+
HibernateJpaParametersParameterAccessor(JpaParameters parameters, Object[] values, EntityManager em) {
5555

5656
super(parameters, values);
5757

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaParametersParameterAccessor.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,21 @@
3131
*/
3232
public class JpaParametersParameterAccessor extends ParametersParameterAccessor {
3333

34+
private final JpaParameters parameters;
35+
3436
/**
3537
* Creates a new {@link ParametersParameterAccessor}.
3638
*
3739
* @param parameters must not be {@literal null}.
3840
* @param values must not be {@literal null}.
3941
*/
40-
public JpaParametersParameterAccessor(Parameters<?, ?> parameters, Object[] values) {
42+
public JpaParametersParameterAccessor(JpaParameters parameters, Object[] values) {
4143
super(parameters, values);
44+
this.parameters = parameters;
45+
}
46+
47+
public JpaParameters getParameters() {
48+
return parameters;
4249
}
4350

4451
@Nullable

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.springframework.data.jpa.domain.JpaSort;
3535
import org.springframework.data.jpa.repository.query.JpqlQueryBuilder.PathAndOrigin;
3636
import org.springframework.data.jpa.repository.query.ParameterBinding.PartTreeParameterBinding;
37-
import org.springframework.data.jpa.repository.query.ParameterMetadataProvider.ParameterMetadata;
3837
import org.springframework.data.jpa.repository.support.JpqlQueryTemplates;
3938
import org.springframework.data.mapping.PropertyPath;
4039
import org.springframework.data.mapping.PropertyReferenceException;
@@ -58,7 +57,7 @@
5857
* @author Andrey Kovalev
5958
* @author Greg Turnquist
6059
*/
61-
class JpaQueryCreator extends AbstractQueryCreator<String, JpqlQueryBuilder.Predicate> {
60+
class JpaQueryCreator extends AbstractQueryCreator<String, JpqlQueryBuilder.Predicate> implements JpqlQueryCreator {
6261

6362
private final ReturnedType returnedType;
6463
private final ParameterMetadataProvider provider;
@@ -113,6 +112,11 @@ public List<ParameterBinding> getBindings() {
113112
return provider.getBindings();
114113
}
115114

115+
@Override
116+
public ParameterBinder getBinder() {
117+
return ParameterBinderFactory.createBinder(provider.getParameters(), getBindings());
118+
}
119+
116120
@Override
117121
protected JpqlQueryBuilder.Predicate create(Part part, Iterator<Object> iterator) {
118122
return toPredicate(part);
@@ -258,10 +262,6 @@ String render(int position) {
258262
return "?" + position;
259263
}
260264

261-
private String render(ParameterMetadata metadata) {
262-
return render(metadata.getPosition());
263-
}
264-
265265
/**
266266
* Creates a {@link Predicate} from the given {@link Part}.
267267
*
@@ -278,7 +278,6 @@ private JpqlQueryBuilder.Predicate toPredicate(Part part) {
278278
* @author Phil Webb
279279
* @author Oliver Gierke
280280
*/
281-
@SuppressWarnings({ "rawtypes" })
282281
private class PredicateBuilder {
283282

284283
private final Part part;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright 2024 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.data.jpa.repository.query;
17+
18+
import java.util.List;
19+
20+
import org.springframework.data.domain.Sort;
21+
22+
/**
23+
* @author Mark Paluch
24+
*/
25+
interface JpqlQueryCreator {
26+
27+
boolean useTupleQuery();
28+
29+
String createQuery(Sort sort);
30+
31+
List<ParameterBinding> getBindings();
32+
33+
ParameterBinder getBinder();
34+
}

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ParameterMetadataProvider.java

+12-10
Original file line numberDiff line numberDiff line change
@@ -62,54 +62,52 @@ class ParameterMetadataProvider {
6262
private final @Nullable Iterator<Object> bindableParameterValues;
6363
private final EscapeCharacter escape;
6464
private final JpqlQueryTemplates templates;
65+
private final JpaParameters jpaParameters;
6566
private int position;
6667

6768
/**
6869
* Creates a new {@link ParameterMetadataProvider} from the given {@link CriteriaBuilder} and
6970
* {@link ParametersParameterAccessor}.
7071
*
71-
* @param builder must not be {@literal null}.
7272
* @param accessor must not be {@literal null}.
7373
* @param escape must not be {@literal null}.
7474
* @param templates must not be {@literal null}.
7575
*/
76-
public ParameterMetadataProvider(CriteriaBuilder builder, ParametersParameterAccessor accessor,
76+
public ParameterMetadataProvider(JpaParametersParameterAccessor accessor,
7777
EscapeCharacter escape, JpqlQueryTemplates templates) {
78-
this(builder, accessor.iterator(), accessor.getParameters(), escape, templates);
78+
this(accessor.iterator(), accessor.getParameters(), escape, templates);
7979
}
8080

8181
/**
8282
* Creates a new {@link ParameterMetadataProvider} from the given {@link CriteriaBuilder} and {@link Parameters} with
8383
* support for parameter value customizations via {@link PersistenceProvider}.
8484
*
85-
* @param builder must not be {@literal null}.
8685
* @param parameters must not be {@literal null}.
8786
* @param escape must not be {@literal null}.
8887
* @param templates must not be {@literal null}.
8988
*/
90-
public ParameterMetadataProvider(CriteriaBuilder builder, Parameters<?, ?> parameters, EscapeCharacter escape,
89+
public ParameterMetadataProvider(JpaParameters parameters, EscapeCharacter escape,
9190
JpqlQueryTemplates templates) {
92-
this(builder, null, parameters, escape, templates);
91+
this(null, parameters, escape, templates);
9392
}
9493

9594
/**
9695
* Creates a new {@link ParameterMetadataProvider} from the given {@link CriteriaBuilder} an {@link Iterable} of all
9796
* bindable parameter values, and {@link Parameters}.
9897
*
99-
* @param builder must not be {@literal null}.
10098
* @param bindableParameterValues may be {@literal null}.
10199
* @param parameters must not be {@literal null}.
102100
* @param escape must not be {@literal null}.
103101
* @param templates must not be {@literal null}.
104102
*/
105-
private ParameterMetadataProvider(CriteriaBuilder builder, @Nullable Iterator<Object> bindableParameterValues,
106-
Parameters<?, ?> parameters, EscapeCharacter escape, JpqlQueryTemplates templates) {
103+
private ParameterMetadataProvider(@Nullable Iterator<Object> bindableParameterValues, JpaParameters parameters,
104+
EscapeCharacter escape, JpqlQueryTemplates templates) {
107105

108-
Assert.notNull(builder, "CriteriaBuilder must not be null");
109106
Assert.notNull(parameters, "Parameters must not be null");
110107
Assert.notNull(escape, "EscapeCharacter must not be null");
111108
Assert.notNull(templates, "JpqlQueryTemplates must not be null");
112109

110+
this.jpaParameters = parameters;
113111
this.parameters = parameters.getBindableParameters().iterator();
114112
this.bindings = new ArrayList<>();
115113
this.bindableParameterValues = bindableParameterValues;
@@ -207,6 +205,10 @@ public ParameterBinding nextSynthetic(Object value, Object source) {
207205
return new ParameterBinding(BindingIdentifier.of(currentPosition), ParameterOrigin.synthetic(value, source));
208206
}
209207

208+
public JpaParameters getParameters() {
209+
return this.jpaParameters;
210+
}
211+
210212
/**
211213
* @author Oliver Gierke
212214
* @author Thomas Darimont

0 commit comments

Comments
 (0)