Skip to content

Commit 52e8f02

Browse files
committed
Workaround MySQL limitation for batched correlated fetch
1 parent 2a16bb1 commit 52e8f02

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

core/impl/src/main/java/com/blazebit/persistence/impl/CriteriaBuilderConfigurationImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.blazebit.persistence.impl.dialect.OracleDbmsDialect;
1919
import com.blazebit.persistence.impl.dialect.PostgreSQLDbmsDialect;
2020
import com.blazebit.persistence.impl.function.alias.AliasFunction;
21+
import com.blazebit.persistence.impl.function.inwrapper.InWrapperFunction;
2122
import com.blazebit.persistence.impl.function.base64.Base64Function;
2223
import com.blazebit.persistence.impl.function.base64.PostgreSQLBase64Function;
2324
import com.blazebit.persistence.impl.function.cast.CastFunction;
@@ -1657,6 +1658,11 @@ private void loadInternalFunctions() {
16571658
jpqlFunctionGroup.add(null, new AliasFunction());
16581659
registerFunction(jpqlFunctionGroup);
16591660

1661+
// in_wrapper function
1662+
jpqlFunctionGroup = new JpqlFunctionGroup(InWrapperFunction.FUNCTION_NAME, false);
1663+
jpqlFunctionGroup.add(null, new InWrapperFunction());
1664+
registerFunction(jpqlFunctionGroup);
1665+
16601666
// column trunc function
16611667
jpqlFunctionGroup = new JpqlFunctionGroup(ColumnTruncFunction.FUNCTION_NAME, false);
16621668
jpqlFunctionGroup.add(null, new ColumnTruncFunction());
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
6+
package com.blazebit.persistence.impl.function.inwrapper;
7+
8+
import com.blazebit.persistence.spi.FunctionRenderContext;
9+
import com.blazebit.persistence.spi.JpqlFunction;
10+
11+
/**
12+
*
13+
* @author Christian Beikov
14+
* @since 2.0.0
15+
*/
16+
public class InWrapperFunction implements JpqlFunction {
17+
18+
public static final String FUNCTION_NAME = "in_wrapper";
19+
20+
@Override
21+
public boolean hasArguments() {
22+
return true;
23+
}
24+
25+
@Override
26+
public boolean hasParenthesesIfNoArguments() {
27+
return true;
28+
}
29+
30+
@Override
31+
public Class<?> getReturnType(Class<?> firstArgumentType) {
32+
return firstArgumentType;
33+
}
34+
35+
@Override
36+
public void render(FunctionRenderContext context) {
37+
int size = context.getArgumentsSize();
38+
if (size != 2) {
39+
throw new RuntimeException("The " + FUNCTION_NAME + " function needs exactly two argument!");
40+
}
41+
context.addChunk("1 and ");
42+
context.addArgument(0);
43+
context.addChunk(" in (select * from ");
44+
context.addArgument(1);
45+
context.addChunk(" tmp_)");
46+
}
47+
}

entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/objectbuilder/transformer/correlation/SubqueryCorrelationBuilder.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,11 @@ public JoinOnBuilder<CorrelationQueryBuilder> correlate(Class<?> entityClass) {
141141
if (limiter.getLimitValue() != null && limiter.getLimitValue() == 1) {
142142
subqueryBuilder = criteriaBuilder.where(correlationExternalAlias).eq().from(entityClass, correlationAlias);
143143
} else {
144-
subqueryBuilder = criteriaBuilder.where(correlationExternalAlias).in().from(entityClass, correlationAlias);
144+
if (getService(DbmsDialect.class).supportsLimitInQuantifiedPredicateSubquery()) {
145+
subqueryBuilder = criteriaBuilder.where(correlationExternalAlias).in().from(entityClass, correlationAlias);
146+
} else {
147+
subqueryBuilder = criteriaBuilder.where("1").eq("subqueryAlias_","FUNCTION('in_wrapper', " + correlationExternalAlias + ", subqueryAlias_)").from(entityClass, correlationAlias);
148+
}
145149
}
146150
limiter.apply(parameterHolder, optionalParameters, subqueryBuilder);
147151
this.correlationBuilder = subqueryBuilder;

0 commit comments

Comments
 (0)