Skip to content

Commit e2a24af

Browse files
committed
HHH-19364 use SelectionSpecification for Restrictions in Processor
1 parent 9253a90 commit e2a24af

File tree

5 files changed

+103
-23
lines changed

5 files changed

+103
-23
lines changed

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java

+35-5
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,43 @@ public String getAttributeDeclarationString() {
7474

7575
abstract String createQueryMethod();
7676

77+
String specificationType() {
78+
return "org.hibernate.query.programmatic.SelectionSpecification";
79+
}
80+
7781
@Override
7882
void createQuery(StringBuilder declaration) {
79-
declaration
80-
.append(localSessionName())
81-
.append(".")
82-
.append(createQueryMethod())
83-
.append("(_query)\n");
83+
if ( !isReactive() && hasRestriction() ) {
84+
declaration
85+
.append( "\t\t\t.createQuery(" )
86+
.append( localSessionName() )
87+
.append( ")\n" );
88+
}
89+
else {
90+
declaration
91+
.append(localSessionName())
92+
.append(".")
93+
.append(createQueryMethod())
94+
.append("(_query)\n");
95+
}
96+
}
97+
98+
void createSpecification(StringBuilder declaration) {
99+
if ( !isReactive() && hasRestriction() ) {
100+
declaration
101+
.append( annotationMetaEntity.importType( specificationType() ) )
102+
.append( ".create(_query)\n" );
103+
}
104+
}
105+
106+
@Override
107+
boolean isUsingSpecification() {
108+
return !isReactive() && hasRestriction();
109+
}
110+
111+
private boolean hasRestriction() {
112+
return parameterTypes().stream()
113+
.anyMatch( type -> isRestrictionParam( type ) || isRangeParam( type ) );
84114
}
85115

86116
void createCriteriaQuery(StringBuilder declaration) {

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ void handleRestrictionParameters(
298298
if ( isRestrictionParam(paramType) ) {
299299
if ( paramType.startsWith(LIST) || paramType.endsWith("[]") ) {
300300
declaration
301-
.append( "\t\t\t.addRestriction(" )
301+
.append( "\t\t\t.restrict(" )
302302
.append( annotationMetaEntity.importType(HIB_RESTRICTION) )
303303
.append( ".all(" )
304304
.append( paramName )
@@ -307,7 +307,7 @@ void handleRestrictionParameters(
307307
}
308308
else {
309309
declaration
310-
.append( "\t\t\t.addRestriction(" )
310+
.append( "\t\t\t.restrict(" )
311311
.append( paramName )
312312
.append( ")\n" );
313313
}
@@ -316,7 +316,7 @@ else if ( isRangeParam(paramType) && returnTypeName!= null ) {
316316
final TypeElement entityElement = annotationMetaEntity.getContext().getElementUtils()
317317
.getTypeElement( returnTypeName );
318318
declaration
319-
.append("\t\t\t.addRestriction(")
319+
.append("\t\t\t.restrict(")
320320
.append(annotationMetaEntity.importType(HIB_RESTRICTION))
321321
.append(".restrict(")
322322
.append(annotationMetaEntity.importType(
@@ -363,7 +363,7 @@ static void closingBrace(StringBuilder declaration) {
363363
}
364364

365365
void unwrapQuery(StringBuilder declaration, boolean unwrapped) {
366-
if ( !unwrapped && isUsingEntityManager() ) {
366+
if ( !unwrapped && isUsingEntityManager() && !isUsingSpecification() ) {
367367
declaration
368368
.append("\t\t\t.unwrap(")
369369
.append(annotationMetaEntity.importType(HIB_SELECTION_QUERY))
@@ -650,6 +650,10 @@ private boolean hasOrdering(List<String> paramTypes) {
650650
|| !orderBys.isEmpty();
651651
}
652652

653+
boolean isUsingSpecification() {
654+
return false;
655+
}
656+
653657
protected void executeSelect(
654658
StringBuilder declaration,
655659
List<String> paramTypes,
@@ -751,7 +755,7 @@ protected void executeSelect(
751755
}
752756
break;
753757
default:
754-
if ( isUsingEntityManager() && !unwrapped && mustUnwrap ) {
758+
if ( isUsingEntityManager() && !unwrapped && mustUnwrap && !isUsingSpecification() ) {
755759
declaration
756760
.append("\t\t\t.unwrap(")
757761
.append(annotationMetaEntity.importType(containerType))

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaDeleteMethod.java

+7
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ boolean singleResult() {
5555
@Override
5656
void executeQuery(StringBuilder declaration, List<String> paramTypes) {
5757
tryReturn(declaration);
58+
createSpecification( declaration );
59+
handleRestrictionParameters( declaration, paramTypes );
5860
createQuery( declaration );
5961
execute( declaration );
6062
}
@@ -75,6 +77,11 @@ String createQueryMethod() {
7577
: "createMutationQuery";
7678
}
7779

80+
@Override
81+
String specificationType() {
82+
return "org.hibernate.query.programmatic.MutationSpecification";
83+
}
84+
7885
private void execute(StringBuilder declaration) {
7986
declaration
8087
.append("\t\t\t.executeUpdate()");

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ void executeQuery(StringBuilder declaration, List<String> paramTypes) {
5757
collectOrdering( declaration, paramTypes );
5858
tryReturn( declaration, paramTypes, containerType );
5959
castResult( declaration );
60-
createQuery( declaration );
60+
createSpecification( declaration );
6161
handleRestrictionParameters( declaration, paramTypes );
62+
createQuery( declaration );
6263
handlePageParameters( declaration, paramTypes, containerType );
6364
boolean unwrapped = !isUsingEntityManager();
6465
unwrapped = enableFetchProfile( declaration, unwrapped );

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java

+50-12
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ public String getAttributeDeclarationString() {
9696
chainSession( declaration );
9797
tryReturn( declaration, paramTypes, containerType );
9898
castResult( declaration );
99-
createQuery( declaration );
99+
createSpecification( declaration );
100100
handleRestrictionParameters( declaration, paramTypes );
101+
createQuery( declaration );
101102
setParameters( declaration, paramTypes, "");
102103
handlePageParameters( declaration, paramTypes, containerType );
103104
boolean unwrapped = !isUsingEntityManager();
@@ -109,21 +110,58 @@ public String getAttributeDeclarationString() {
109110
return declaration.toString();
110111
}
111112

113+
String specificationType() {
114+
return isUpdate
115+
? "org.hibernate.query.programmatic.MutationSpecification"
116+
: "org.hibernate.query.programmatic.SelectionSpecification";
117+
}
118+
112119
@Override
113120
void createQuery(StringBuilder declaration) {
114-
declaration
115-
.append(localSessionName())
116-
.append('.')
117-
.append(createQueryMethod())
118-
.append("(")
119-
.append(getConstantName());
120-
if ( returnTypeClass != null && !isUpdate ) {
121+
if ( returnTypeClass != null && !isReactive() && hasRestriction() ) {
122+
declaration
123+
.append( "\t\t\t.createQuery(" )
124+
.append( localSessionName() )
125+
.append( ")\n" );
126+
}
127+
else {
128+
// can't use Specification
129+
declaration
130+
.append(localSessionName())
131+
.append('.')
132+
.append(createQueryMethod())
133+
.append("(")
134+
.append(getConstantName());
135+
if ( returnTypeClass != null && !isUpdate ) {
136+
declaration
137+
.append(", ")
138+
.append(annotationMetaEntity.importType(returnTypeClass))
139+
.append(".class");
140+
}
141+
declaration.append(")\n");
142+
}
143+
}
144+
145+
private void createSpecification(StringBuilder declaration) {
146+
if ( returnTypeClass != null && !isReactive() && hasRestriction() ) {
121147
declaration
122-
.append(", ")
123-
.append(annotationMetaEntity.importType(returnTypeClass))
124-
.append(".class");
148+
.append( annotationMetaEntity.importType( specificationType() ) )
149+
.append( ".create(" )
150+
.append( annotationMetaEntity.importType( returnTypeClass ) )
151+
.append( ".class, " )
152+
.append( getConstantName() )
153+
.append( ")\n" );
125154
}
126-
declaration.append(")\n");
155+
}
156+
157+
@Override
158+
boolean isUsingSpecification() {
159+
return returnTypeClass != null && !isReactive() && hasRestriction();
160+
}
161+
162+
private boolean hasRestriction() {
163+
return parameterTypes().stream()
164+
.anyMatch( type -> isRestrictionParam( type ) || isRangeParam( type ) );
127165
}
128166

129167
private String createQueryMethod() {

0 commit comments

Comments
 (0)