As you are using AliasToBeanResultTransformer
, you have to declare proper alias
names in your query
, as its name says that it will transform the results into your resultClass
using thealias
names.
The transformTuple
method of AliasToBeanResultTransformer
class uses the alias
names to find the setter methods of your resultClass (StudentDto)
:
下面这个就是AliasToBeanResultTransformer类的transformTuple方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public
Object transformTuple(Object[] tuple, String[] aliases) {
Object result;
try
{
if
( setters ==
null
) {
setters =
new
Setter[aliases.length];
for
(
int
i =
0
; i < aliases.length; i++ ) {
String alias = aliases[i];
if
( alias !=
null
) {
setters[i] = propertyAccessor.getSetter( resultClass, alias );
}
}
}
result = resultClass.newInstance();
for
(
int
i =
0
; i < aliases.length; i++ ) {
if
( setters[i] !=
null
) {
setters[i].set( result, tuple[i],
null
);
}
}
}
catch
( InstantiationException e ) {
throw
new
HibernateException(
"Could not instantiate resultclass: "
+ resultClass.getName() );
}
catch
( IllegalAccessException e ) {
throw
new
HibernateException(
"Could not instantiate resultclass: "
+ resultClass.getName() );
}
return
result;
}
|
In order to make AliasToBeanResultTransformer
work properly you need to use proper alias names in yourquery
. If the property name in your StudentDto
class is name
, you should useselect student.name as name
; using select student.name as n
will again throw exception. The alias
names that you are using in the query
should be same as the property names in your DTO class.