为了性能考虑,使用了
native sql
。因为需要分页,需要
2
个
sql
,一个获取
list
一个取得总数。获取
list
很好写:
1

private
List getListByNativeSQL(
final
Class cls,
final
String sql)
{
2
3
return
(List) getHibernateTemplate().execute(
new
HibernateCallback()
{
4
5
public
Object doInHibernate(Session session)
6
7
throws
HibernateException
{
8
9
return
session.createSQLQuery(sql).addEntity(cls).list();
10
11
}
12
13
}
);
14
15
}
16



2

3



4

5

6

7



8

9

10

11

12

13

14

15

16

获取总数查了下 hibernate 的 reference, 试了几次才明白用法 :<o:p></o:p>
<o:p> </o:p>
1

private
BigInteger getCountByNativeSQL(
final
String sql)
{
2
3
return
(BigInteger) getHibernateTemplate().execute(
4
5
new
HibernateCallback()
{
6
7
public
Object doInHibernate(Session session)
8
9
throws
HibernateException
{
10
11
return
(BigInteger) (session.createSQLQuery(sql).uniqueResult());
12
13
}
14
15
}
);
16
17
}
18



2

3

4

5



6

7

8

9



10

11

12

13

14

15

16

17

18

这里的
sql 是“ select count(*) 开头的”。这里大家可能要问,为什么要使用 BigInteger ,因为如果用 uniqueResult() 默认就返回 BigInteger ,而 BigInteger cast 成 Integer 会出错。那么如果我就是要返回 Integer 呢,可以通过下面的办法实现: <o:p> </o:p>
<o:p> </o:p>
1

private
Integer getCountByNativeSQL(
final
String sql)
{
2
3
return
(Integer) getHibernateTemplate().execute(
4
5
new
HibernateCallback()
{
6
7
public
Object doInHibernate(Session session)
8
9
throws
HibernateException
{
10
11
return
(Integer) (session.createSQLQuery(sql).addScalar(
"
count
"
, Hibernate.INTEGER).uniqueResult());
12
13
}
14
15
}
);
16
17
}
18



2

3

4

5



6

7

8

9



10

11

12

13

14

15

16

17

18

大家注意粗体的部分,这里是给一个
alias 赋予类型,那么 sql 就需要变成以 ”select count(*) as count ” 开头了。 <o:p> </o:p>