hibernate native sql的小技巧

hibernate native sql的小技巧

为了性能考虑,使用了 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

 

获取总数查了下 hibernate reference, 试了几次才明白用法 :

 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

这里的

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

 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

大家注意粗体的部分,这里是给一个

alias 赋予类型,那么 sql 就需要变成以 ”select count(*) as count ” 开头了。

你可能感兴趣的:(hibernate native sql的小技巧)