为了性能考虑,使用了 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 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
获取总数查了下 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 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
这里的
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 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
大家注意粗体的部分,这里是给一个
alias 赋予类型,那么 sql 就需要变成以 ”select count(*) as count ” 开头了。 <o:p> </o:p>