• hibernate DetachedCriteria 子查询对应sql的in语句


    需要从两个关联进行数据查询。找了一下午,可算找到个能看懂的 

    原文链接:http://blog.sina.com.cn/s/blog_ba1bed340101lvx1.html


    从数据库查询的sql语句如下:

    select * from bdorder where Id in (select DISTINCT details from orderDetail  "
    					+ "where detailStatus like '%3N') "
    					+ "and status like '%3Y'
    

    项目中使用的是hibernate框架。

    使用到criteria ,DetachedCriteria 单个表用的时候那是相当方便,第一次多表查询,就有点蒙了,

    首先是单个表的查询

     1 order实体
     2 
     3 //对order表进行查询
     4 //初始化criteria
     5 DetachedCriteria criteria = DetachedCriteria.forClass(BDOrder.class);
     6 
     7 //给criteria添加条件,引号中status为实体中的字段,后一个为值
     8 criteria.add(Restrictions.like("status", states));
     9 
    10 //添加多个条件。有多少加多少。
    11 ...
    12 ...
    13 
    14 //查找结果。
    15 List<BDOrder> orderList = this.getHibernateTemplate().findByCriteria(criteria);

    两个表的查询,实现最开始的sql语句

     1 BDOrder 实体和 BDOrderDetail 实体
     2 DetachedCriteria criteria = DetachedCriteria.forClass(BDOrder.class);
     3 
     4 //添加查询条件
     5 criteria.add()
     6 
     7 //初始化BDOrderDeaila 的criterial
     8 DetachedCriteria criteriaDetail = DetachedCriteria.forClass(BDOrderDetail.class);
     9 
    10 //添加OrderDetail实体的查询条件
    11 criteriaDetial.add(Restrictions.like("detailStatus", "%3N"))
    12 
    13 //设置这个表的查询结果。注意details为实体映射文件中对应的字段,不是数据库中的列名
    14 criteriaDetail.setProjection(Property.forName("details "));
    15 
    16 //设置去除查询结果中的重复数据
    17 criteriaDetail.setResultTransformer(criteriaDetail.DISTINCT_ROOT_ENTITY);
    18 
    19 
    20 //关联两个实体的关系
    21 criteria.add(Property.forName("id").in(criteriaDetail));
    22 
    23 
    24 //然后直接使用criteria去查询就可以了。
    25 //查找结果。
    26 List<BDOrder> orderList = this.getHibernateTemplate().findByCriteria(criteria);
    27 
    28 //以上可以实现最开始的那句sql,

      顺便复习一下Restrictions的用法:

    方法

    说明

    Restrictions.eq

    Restrictions.allEq

    利用Map来进行多个等于的限制

    Restrictions.gt

    Restrictions.ge

    >=

    Restrictions.lt

    Restrictions.le

    <=

    Restrictions.between

    BETWEEN

    Restrictions.like

    LIKE

    Restrictions.in

    in

    Restrictions.and

    and

    Restrictions.or

    or

    Restrictions.sqlRestriction

    用SQL限定查询

  • 相关阅读:
    搜索引擎常用技巧
    WinRaR去广告弹窗
    逆向破解之160个CrackMe —— 003
    逆向破解之160个CrackMe —— 002
    逆向破解之160个CrackMe —— 001(下)
    逆向破解之160个CrackMe —— 001(中)
    逆向破解之160个CrackMe —— 001(上)
    VMWare虚拟机无法开启,显示模块“Disk”启动失败解决办法
    uefi+gpt重装系统提示需要安装到gpt分区盘解决办法
    neg与sbb指令的结合使用
  • 原文地址:https://www.cnblogs.com/zhangkaikai/p/6679371.html
Copyright © 2020-2023  润新知