请选择 进入手机版 | 继续访问电脑版

Hibernate封装的查询方法的皮毛介绍(附实例代码)

发表于 2017-04-19 12:00 显示全部楼层 23 815

    现在市面上的很多公司都是使用封装好的Hibernate进行开发,原因就是速度,方便,封装的方法非常丰富,虽然说mybatis效率很高但是由于其的复杂程度和程序员的接受程度不同所以用的公司也是看不同情况!今天不赘述,只谈Hibernate.

    本人现在进行的是商品库的开发,因为公司的注册用户不是很多所以对于性能的要求不是特别高,所以在接下来我讲的东西中如果有性能影响的请自行忽略或者指正出来,非常感谢!

    下图是一个使用hibernate进行查询的实例:


 public PageResult<ProdSku> queryUnilifeProd(List<String> catalogIds, String location, Pager pager, String order)
    {
        DetachedCriteria sku = DetachedCriteria.forClass(ProdSku.class, "sku");
        sku.add(Restrictions.in("status", Arrays.asList(new Byte[] { ProdSku.Status.NORMAL.getCode(),
                ProdSku.Status.PENDING.getCode(), ProdSku.Status.PRESALE.getCode(), ProdSku.Status.SELLOUT.getCode() })));
        if(StringUtils.isNotBlank(location))
        {
            DetachedCriteria prop = DetachedCriteria.forClass(ProdSkuProp.class, "prop");
            prop.add(Restrictions.eq("code", SkuAttrs.PRODUCT_SALE_AREA.getCode()));
            prop.add(Restrictions.eq("status", CommonStatus.NORMAL.getCode()));
            prop.add(Property.forName("sku.id").eqProperty("prop.skuId"));
            sku.add(Subqueries.exists(prop.setProjection(Projections.id())));
            
            DetachedCriteria value = DetachedCriteria.forClass(ProdSkuPropValue.class, "value");
            value.add(Restrictions.or(Restrictions.eq("value", location), Restrictions.eq("value", "000000000")));
            value.add(Restrictions.eq("status", CommonStatus.NORMAL.getCode()));
            value.add(Property.forName("prop.id").eqProperty("value.skuPropId"));
            prop.add(Subqueries.exists(value.setProjection(Projections.id())));
        }
        if(!CollectionUtils.isEmpty(catalogIds))
        {
            DetachedCriteria skuProp = DetachedCriteria.forClass(ProdSkuProp.class, "skuProp");
            skuProp.add(Restrictions.eq("code", SkuAttrs.UNILIFE_CATALOG_ID.getCode()));
            skuProp.add(Restrictions.eq("status", CommonStatus.NORMAL.getCode()));
            skuProp.add(Property.forName("sku.id").eqProperty("skuProp.skuId"));
            sku.add(Subqueries.exists(skuProp.setProjection(Projections.id())));
            
            DetachedCriteria skuPropValue = DetachedCriteria.forClass(ProdSkuPropValue.class, "skuPropValue");
            skuPropValue.add(Restrictions.in("value", catalogIds));
            skuPropValue.add(Restrictions.eq("status", CommonStatus.NORMAL.getCode()));
            skuPropValue.add(Property.forName("skuProp.id").eqProperty("skuPropValue.skuPropId"));
            skuProp.add(Subqueries.exists(skuPropValue.setProjection(Projections.id())));
        }
        return criteriaPageSearch(sku, order, pager);
    }


    该方法的作用是根据商品的类目和商品的销售地址进行对商品的查询("pager"是进行分页查询,"order"是排序字段,因与介绍的无太大关系所以不进行赘述) .如果对商品的基本的数据结构不熟悉的可以百度sku,spu等进行查询对应关系.(后续进行对商品库的数据结构进行介绍).


DetachedCriteria sku = DetachedCriteria.forClass(ProdSku.class, "sku");


    这个方法相当于是对指定的实体类进行查询前的封装,然后对其进行查询的参数进行添加,最后通过criteriaPagerSearch进行查询.(对上面这段代码有疑惑的可以参考https://zhidao.baidu.com/question/497420874786146164.html).


ku.add(Restrictions.in("status", Arrays.asList(new Byte[] { ProdSku.Status.NORMAL.getCode(),
                ProdSku.Status.PENDING.getCode(), ProdSku.Status.PRESALE.getCode(), ProdSku.Status.SELLOUT.getCode() })));


    此段代码的意思是:对查询对象添加查询条件,对字段"status"进行条件封装,使用的Restrictions.in是指该字段匹配的条件在对应的集合中匹配都可以.

    在第一个判断代码块中,同样进行了对ProdSkuProp该对象进行条件查询的实体封装.


prop.add(Restrictions.eq("code", SkuAttrs.PRODUCT_SALE_AREA.getCode()));


    这里应为不再是可以等于多个值的判断所以使用的不是Restrictions.in而是使用的是eq进行等同的判断.


prop.add(Property.forName("sku.id").eqProperty("prop.skuId"));


    因为这里我们的查询是需要通过两张表进行查询的一张是ProdSku一张是ProdSkuProp进行的查询,所以我们需要将两张表进行关联,使用的是上面的方法,将两张表的两个字段进行关联.


sku.add(Subqueries.exists(prop.setProjection(Projections.id())));


    这里进行的是对关联的结果ProdSkuProp在添加了条件之后再进行查询后必须要在ProdSku这个实体查询之后依旧存在(这里本来是想使用数字替代Projections.id()以提高效率,但是在Hibernate封装的方法中没有找到更为高效的替代方式,所以最快捷的就是使用id进行替代了).

    最后使用criteriaPageSearch进行查询分页查询.

(第一次写技术贴,有任何错误或者值得改进的欢迎指正!)


回复 使用道具
举报
小灸舞

发表于 2017-06-23 16:00 显示全部楼层

回复 支持 反对 使用道具
举报
pcatzj

发表于 2017-06-22 23:58 显示全部楼层

回复 支持 反对 使用道具
举报
执笔落花雪

发表于 2017-06-16 03:47 显示全部楼层

回复 支持 反对 使用道具
举报
寒雪飘影

发表于 2017-05-31 23:52 显示全部楼层

回复 支持 反对 使用道具
举报
山秀

发表于 2017-05-15 08:34 显示全部楼层

回复 支持 反对 使用道具
举报
园子的遇见

发表于 2017-05-10 08:53 显示全部楼层

回复 支持 反对 使用道具
举报
园子的遇见

发表于 2017-05-09 18:42 显示全部楼层

回复 支持 反对 使用道具
举报
我不是悟空

发表于 2017-05-08 11:18 显示全部楼层

回复 支持 反对 使用道具
举报
炒菜不加盐

发表于 2017-05-06 15:41 显示全部楼层

每一个成功者都有一个开始。成功的路,始于回复。

回复 支持 反对 使用道具
举报
123下一页

发表新文章
青埂峰峰主

小码哥会员

0

学分

206

学币

383

积分

小码哥会员

Rank: 3Rank: 3

积分
383

关注新浪微博关注小码哥教育公众号活动达人勋章

Ta的主页 发消息
精华帖排行榜

精彩推荐

  • 关注小码哥教育