9
9
import org .hibernate .sql .results .spi .RowTransformer ;
10
10
11
11
import java .lang .reflect .Constructor ;
12
+ import java .util .Arrays ;
12
13
import java .util .List ;
13
14
14
15
import org .hibernate .query .sqm .SqmExpressible ;
15
16
import org .hibernate .query .sqm .tree .SqmExpressibleAccessor ;
16
17
18
+ import static org .hibernate .query .sqm .tree .expression .Compatibility .areAssignmentCompatible ;
19
+
17
20
/**
18
21
* {@link RowTransformer} instantiating an arbitrary class
19
22
*
@@ -31,7 +34,7 @@ public RowTransformerConstructorImpl(Class<T> type, TupleMetadata tupleMetadata)
31
34
sig [i ] = resolveElementJavaType ( elements .get ( i ) );
32
35
}
33
36
try {
34
- constructor = type . getDeclaredConstructor ( sig );
37
+ constructor = findMatchingConstructor ( type , sig );
35
38
constructor .setAccessible ( true );
36
39
}
37
40
catch (Exception e ) {
@@ -51,6 +54,38 @@ private static Class<?> resolveElementJavaType(TupleElement<?> element) {
51
54
return element .getJavaType ();
52
55
}
53
56
57
+ private Constructor <T > findMatchingConstructor (
58
+ Class <T > type ,
59
+ Class <?>[] sig ) throws NoSuchMethodException {
60
+ try {
61
+ return type .getDeclaredConstructor ( sig );
62
+ }
63
+ catch (NoSuchMethodException | SecurityException e ) {
64
+ constructor_loop :
65
+ for ( final Constructor <?> constructor : type .getDeclaredConstructors () ) {
66
+ final Class <?>[] parameterTypes = constructor .getParameterTypes ();
67
+ if ( parameterTypes .length == sig .length ) {
68
+ for ( int i = 0 ; i < sig .length ; i ++ ) {
69
+ final Class <?> parameterType = parameterTypes [i ];
70
+ final Class <?> argType = sig [i ];
71
+ final boolean assignmentCompatible ;
72
+ assignmentCompatible =
73
+ argType == null && !parameterType .isPrimitive ()
74
+ || areAssignmentCompatible (
75
+ parameterType ,
76
+ argType
77
+ );
78
+ if ( !assignmentCompatible ) {
79
+ continue constructor_loop ;
80
+ }
81
+ }
82
+ return (Constructor <T >) constructor ;
83
+ }
84
+ }
85
+ throw new NoSuchMethodException ();
86
+ }
87
+ }
88
+
54
89
@ Override
55
90
public T transformRow (Object [] row ) {
56
91
try {
0 commit comments