关闭

Hibernate4对View的查询实践

标签: hibernateormview
94人阅读 评论(0) 收藏 举报

最初我们使用Hibernate的方法一般都比较初级,或是直接写SQL语句,然后让Hibernate去直接执行查询,然后返回Object[]结果。这样做完全没有利用到Hibernate的特性,只是单纯的让Hibernate去执行JDBC的功能。

后来我们引入ORM,还算是用到了一点Hibernate的功能,使单表查询具有了一定的封装性。但是在对于返回类型与数据库字段不一致,或是多表查询时,我们一般是取出直接映射到表的Entity实体,然后自己在Service层封装返回对象,不仅编码非常不方便,而且增大了服务器的负担。

后来我们选择使用视图来进行数据库的多表查询,这样虽然增大了一些数据库的开销,但是我们的代码开发变得容易了许多,也增强了代码的易读性。

后来我们发现在大型项目中,DAO层出现了大量的HQL/SQL语句,这就造成了修改困难和代码易读性下降的缺点。我们开始引入Criteria——Hibernate标准化查询。这样既增强了代码的易读性,又较好的保证了Hibernate的良好封装性。

但是在使用视图查询时,由于视图是没有主键的,而Hibernate的ORM要求映射对象必须要有主键。所以Hibernate使用了一个办法来实现这个功能,就是引入了@EmbeddedId这一联合主键的方式来表示我们的视图对象,并将它封装在一个“ViewName+Id”的实体对象中,在它的外层才是我们查询时所用到的视图名。

然而一般视图都是直接提供给前端的返回对象,如果外面套一层Id,实在是不方便,于是我们只好写一个类来帮助我们进行封装。做一个妥协,由于没有循环创建对象,这种方法基本不影响服务器效率


    public void getViewPageResult(Page<T> page,Class clazz){
        List<T> list = page.getResult(); //获取Page的视图返回结果(内嵌联合主键Id的)
        List<T2> listAfter = new ArrayList<T2>(0); //真正要返回给前端的结果
        T2 resultTemp = null;
        try {
            Method method = clazz.getMethod("getId", null); //取出Hibernate返回的视图对象中的Id字段
            for (T temp : list) {
                resultTemp = (T2) method.invoke(temp);
                listAfter.add(resultTemp); //取出并放到最终要返回的结果类型中
            }
            page.setResult(listAfter);
        } catch (Exception e){
            e.printStackTrace();
        }
    }


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:187次
    • 积分:22
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档