Skip to content

Commit 461bc56

Browse files
kamilkrzywanskiaasysplvelo
authored
The transform method throws a ClassCastException when working with joinFetch since 4.4.0 (#534)
* ported fix for #3264 querydsl/querydsl#3264 from https://github.com/aasyspl/querydsl * test for regression querydsl/querydsl#3264 * Allow test to throw exceptions when needed * Move logic for tuple creation to TupleUtils --------- Co-authored-by: sapolinarski <[email protected]> Co-authored-by: Marvin Froeder <[email protected]>
1 parent 01aadb8 commit 461bc56

File tree

6 files changed

+59
-4
lines changed

6 files changed

+59
-4
lines changed

querydsl-core/src/main/java/com/querydsl/core/group/GroupByGenericCollection.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.querydsl.core.types.FactoryExpression;
2121
import com.querydsl.core.types.FactoryExpressionUtils;
2222
import com.querydsl.core.types.Projections;
23+
import com.querydsl.core.util.TupleUtils;
2324
import java.util.Collection;
2425
import java.util.Objects;
2526
import java.util.function.Supplier;
@@ -60,8 +61,10 @@ public RES transform(FetchableQuery<?, ?> query) {
6061
GroupImpl group = null;
6162
K groupId = null;
6263
while (iter.hasNext()) {
64+
Tuple tuple = TupleUtils.toTuple(iter.next(), expressions);
6365
@SuppressWarnings("unchecked") // This type is mandated by the key type
64-
K[] row = (K[]) iter.next().toArray();
66+
K[] row = (K[]) tuple.toArray();
67+
// end of workaround
6568
if (group == null) {
6669
group = new GroupImpl(groupExpressions, maps);
6770
groupId = row[0];

querydsl-core/src/main/java/com/querydsl/core/group/GroupByGenericMap.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.querydsl.core.types.FactoryExpression;
2121
import com.querydsl.core.types.FactoryExpressionUtils;
2222
import com.querydsl.core.types.Projections;
23+
import com.querydsl.core.util.TupleUtils;
2324
import java.util.Map;
2425
import java.util.function.Supplier;
2526

@@ -57,8 +58,11 @@ public RES transform(FetchableQuery<?, ?> query) {
5758
CloseableIterator<Tuple> iter = query.select(expr).iterate();
5859
try {
5960
while (iter.hasNext()) {
61+
Tuple tuple = TupleUtils.toTuple(iter.next(), expressions);
62+
6063
@SuppressWarnings("unchecked") // This type is mandated by the key type
61-
K[] row = (K[]) iter.next().toArray();
64+
K[] row = (K[]) tuple.toArray();
65+
// end of workaround
6266
K groupId = row[0];
6367
GroupImpl group = (GroupImpl) groups.get(groupId);
6468
if (group == null) {

querydsl-core/src/main/java/com/querydsl/core/group/GroupByIterate.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.querydsl.core.types.FactoryExpression;
2121
import com.querydsl.core.types.FactoryExpressionUtils;
2222
import com.querydsl.core.types.Projections;
23+
import com.querydsl.core.util.TupleUtils;
2324
import java.util.NoSuchElementException;
2425
import java.util.Objects;
2526

@@ -73,8 +74,12 @@ public V next() {
7374
}
7475

7576
while (iter.hasNext()) {
77+
// workaround from https://github.com/querydsl/querydsl/issues/3264
78+
Tuple tuple = TupleUtils.toTuple(iter.next(), expressions);
79+
7680
@SuppressWarnings("unchecked") // This type is mandated by the key type
77-
K[] row = (K[]) iter.next().toArray();
81+
K[] row = (K[]) tuple.toArray();
82+
// end of workaround
7883
if (group == null) {
7984
group = new GroupImpl(groupExpressions, maps);
8085
groupId = row[0];

querydsl-core/src/main/java/com/querydsl/core/group/GroupByMap.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.querydsl.core.types.FactoryExpression;
2121
import com.querydsl.core.types.FactoryExpressionUtils;
2222
import com.querydsl.core.types.Projections;
23+
import com.querydsl.core.util.TupleUtils;
2324
import java.util.LinkedHashMap;
2425
import java.util.Map;
2526

@@ -51,8 +52,11 @@ public Map<K, V> transform(FetchableQuery<?, ?> query) {
5152
}
5253
try (CloseableIterator<Tuple> iter = query.select(expr).iterate()) {
5354
while (iter.hasNext()) {
55+
Tuple tuple = TupleUtils.toTuple(iter.next(), expressions);
56+
5457
@SuppressWarnings("unchecked") // This type is mandated by the key type
55-
K[] row = (K[]) iter.next().toArray();
58+
K[] row = (K[]) tuple.toArray();
59+
// end of workaround
5660
K groupId = row[0];
5761
GroupImpl group = (GroupImpl) groups.get(groupId);
5862
if (group == null) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.querydsl.core.util;
2+
3+
import com.querydsl.core.Tuple;
4+
import com.querydsl.core.types.Expression;
5+
import com.querydsl.core.types.Projections;
6+
7+
/** TupleUtils provides tuple related utility functionality */
8+
public final class TupleUtils {
9+
10+
public static Tuple toTuple(Object next, Expression<?>[] expressions) {
11+
// workaround from https://github.com/querydsl/querydsl/issues/3264
12+
Tuple tuple;
13+
if (next instanceof Tuple) {
14+
tuple = (Tuple) next;
15+
} else if (next instanceof Object[]) {
16+
tuple = Projections.tuple(expressions).newInstance((Object[]) next);
17+
} else {
18+
throw new IllegalArgumentException(String.format("Could not translate %s into tuple", next));
19+
}
20+
return tuple;
21+
}
22+
}

querydsl-jpa/src/test/java/com/querydsl/jpa/HibernateBase.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414
package com.querydsl.jpa;
1515

1616
import static org.junit.Assert.*;
17+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
1718

1819
import com.mysema.commons.lang.CloseableIterator;
1920
import com.querydsl.core.DefaultQueryMetadata;
21+
import com.querydsl.core.Target;
2022
import com.querydsl.core.Tuple;
23+
import com.querydsl.core.group.GroupBy;
24+
import com.querydsl.core.testutil.ExcludeIn;
2125
import com.querydsl.core.types.EntityPath;
2226
import com.querydsl.core.types.Expression;
2327
import com.querydsl.jpa.domain.Cat;
@@ -158,4 +162,17 @@ public void createQuery3() {
158162
assertTrue(row instanceof String);
159163
}
160164
}
165+
166+
@Test
167+
@ExcludeIn(Target.DERBY)
168+
public void createQuery4() {
169+
assertDoesNotThrow(
170+
() ->
171+
query()
172+
.from(cat)
173+
.leftJoin(cat.kittens)
174+
.fetchJoin()
175+
.distinct()
176+
.transform(GroupBy.groupBy(cat.id).as(cat)));
177+
}
161178
}

0 commit comments

Comments
 (0)