hibernate查询

1 hibernate原生sql查询
<hibernate-mapping package="com.byd.erpit.clims.model.base">
 <class name="LabItem" table="C_LABITEM">
  <id name="id" column="ITEM_ID" type="long">
   <generator class="sequence">
    <param name="sequence">C_LABITEM_SN</param>
   </generator>
  </id>
  <!-- 配置与实验室的many-to-one关系 -->
  <many-to-one name="lab" column="LAB_ID" class="Lab" />  
  <!-- 配置与使用设备的one-to-many关系   -->
  <bag name="itemTool"  cascade="all,save-update,delete-orphan" inverse="true" >
   <key column="TEST_ID" />
   <one-to-many class="ItemTool" />  
  </bag>
 </class>
 //根据检测项目名称 实验室名称 模糊查询出 所有的检测项目
 <sql-query name="labItem.findLabItemByLabNameAndItemName">
  <return class="LabItem" />
  <![CDATA[
  select * from C_LABITEM where LAB_ID in
   (select LAB_ID from C_LAB where INF_LAB in(select LAB_ID from C_LAB where LAB_NAME like :labName ) and kind_rmk in('2','4'))
   and CITEM_ID in(select id from C_TESTITEM where ITEM_NAME like :itemName)
   and item_id in(select min(item_id) from c_labitem group by citem_id)
  ]]>
 </sql-query>
 <query name="findUserDataByCreateDate">
  select distinct a
  from LabItem a left join a.lab b
  where a.lab in (:infLabId)
 </query>
</hibernate-mapping>

这里的 在hibernate 映射文件中 配置的<sql-query />就是 hibernate原生sql查询:
返回的是一个 “持久态”的持久化对象

DaoImpl:使用
 /**
  * 根据检测项目名称 实验室名称 模糊查询出 所有的检测项目
  */
 public List<LabItem> findLabItemByLabNameAndItemName(String labName,String itemName){
  Map params = new HashMap();
  params.put("labName","%"+labName.trim()+"%");
  params.put("itemName","%"+itemName.trim()+"%"); 
  List list=super.getNamedQueryResult("labItem.findLabItemByLabNameAndItemName",params);
  return list;
 }
 super.getNamedQueryResult()方法是daoImpl从DaoSupport工具类里面继承过来的方法。
 描述:
   protected final List getNamedQueryResult(String queryName, Map parameterMap){
  Query query = getNamedQuery(queryName);
  setQueryParameters(query, parameterMap);
  return getQueryResults(query);
   }
   private Query getNamedQuery(String queryName) {
  return super.getSession().getNamedQuery(queryName);
  //这里的super.getSession()方法是从HibernateDaoSupport类中继承过来的
   }

   private List getQueryResults(Query query) {
    return query.list();
   }

◇利用HQL 返回javaBean(持久化对象)
 配置在映射文件中: 
 <query name="findUserDataByCreateDate">
   select distinct a
   from Wprojectm a left join a.wprojteam b
   where a.proj_fact in (:proj_fact)
   and (a.proj_manager.id = :user_id or a.manager_window.id = :user_id or b.manager.id = :user_id)
   and a.create_dt between :start_date and :end_date
   order by a.create_dt
 </query>

 @Override
 public List<Wprojectm> getProjByDate(String[] factArr, Long user_id,
   Timestamp start_date, Timestamp end_date) {
  Map params = new HashMap();
  List list = new ArrayList();
  for(String s:factArr){
   list.add(s);
  }
  params.put("proj_fact", list);
  params.put("user_id", user_id);
  params.put("start_date", start_date);
  params.put("end_date", end_date);
  log.info(params);
  return super.getNamedQueryResult("findUserDataByCreateDate",params);
 }

◇利用SQL 返回特定的类型

<!--  查詢專案所有發起年份 -->
  <sql-query name="pqproj.qpprojm.findAllYear"> 
 <return-scalar type="string" column="createYear"/> 
 select distinct to_char(create_dt,'YYYY') createYear from wpqprojm order by to_char(create_dt,'YYYY') desc
  </sql-query>
    /**
     * 抓取專案所有發起年份     
     */
 public List<String> findAllYear() {   
  return super.getNamedQueryResult("pqproj.qpprojm.findAllYear");
 }

◇利用SQL 返回特定的BEAN类型(DTO)

 <sql-query name="findAllChildByParentId"> 
  <return-scalar type="integer" column="level"/>
  <return alias="f" class="ItSysModule" />
  SELECT f.*,level
  FROM p_itsysmodule f START WITH parent_id = :parent_id and lock_rmk='0'
  CONNECT BY PRIOR mis_id = parent_id
 </sql-query>

 @Override
 public ItSysModuleHierDTO[] findAllChildById(long id) {
  Map params = new HashMap();
  params.put("parent_id", new Long(id));
  List list = super.getNamedQueryResult("findAllChildByParentId",params);
  ItSysModuleHierDTO[] result = new ItSysModuleHierDTO[list.size()];
  for(int i = 0; i < list.size(); i++){
   Object[] obj = (Object[]) list.get(i);
   result[i] = new ItSysModuleHierDTO(obj);

  }
  return result;
 }

2 条件查询——DetachedCriteria:
 /**
  * 根据群组id取得此群组所有的有权限的程序
  * @return:返回此群组有权限的程序集合
  */
 public List<GroupAccess> getGroupAccessesByGroupId(Long groupId){
  DetachedCriteria criteria = DetachedCriteria.forClass(GroupAccess.class);
  criteria.add(Property.forName("id.userGroup.id").eq(groupId));
  return super.findByCriteria(criteria);
 }
 public List<T> findByCriteria(DetachedCriteria criteria){
  return getHibernateTemplate().findByCriteria(criteria);
 }

3 DaoImpl中的hql查询:
 /**
  * 根据 报告id 查询出 此报告的 检测结果
  * @param reportId
  * @return
  */
 public OrdermDTO findOrdermReportTestResult(Long reportId){
  String hql="select a from Report a where a.id=:reportId";
  Map myParam = new HashMap();
  myParam.put("reportId", reportId);
  List list = super.getQueryResult(hql, myParam);
  OrdermDTO dto=new OrdermDTO();
  if(list.size()>0){
   Report report=(Report)list.get(0);
   dto.setTestResult(report.getTestResult()==null?"":report.getTestResult());
  }
  return dto;
 }

   protected final List getQueryResult(String hql, Map parameterMap){
    Query query = setQueryParameters(hql, parameterMap);
       return getQueryResults(query);
   }

4 DaoImpl中的sql查询:
 /**
  * 根据委托单id 查找出委托单 所有样品
  * @param orderId
  * @return
  */
 public List<SampleInfo> findOrderApplySamplesByOrderId(Long orderId){
  List<SampleInfo> samplesList=new ArrayList<SampleInfo>();
  String sql="SELECT ID,SAMPLE_NO,SAMPLE_NAME,CS_NO,to_char(DELIVERY_DATE,'yyyy/MM/dd HH24:mi') AS DELIVERY_DATE ,STATUS_RMK,NOW_STATUS" +
    " FROM C_SAMPLE WHERE ORDER_ID=:orderId";
  Map param=new HashMap();
  param.put("orderId", orderId);
  List resultList=super.getSQLQueryResult(sql,param);
  for(int i=0;i<resultList.size();i++){
   Object[] obj = (Object[]) resultList.get(i);
   SampleInfo sampleInfo=new SampleInfo();
   sampleInfo.setId(Long.parseLong(obj[0].toString()));
   sampleInfo.setSampleNo(obj[1].toString());
   sampleInfo.setSampleName(obj[2].toString());
   sampleInfo.setCsNo(null==obj[3]?"":obj[3].toString());
   sampleInfo.setDeliveryDate(null==obj[4]?null:DateUtil.parseToTimestamp(obj[4].toString(),"yyyy/MM/dd HH:mm"));
   sampleInfo.setStatusRmk(null==obj[5]?"":obj[5].toString());
   sampleInfo.setNowStatus(null==obj[6]?"":obj[6].toString());
   samplesList.add(sampleInfo);
  }
  
  return samplesList;
 }

 描叙:
 1 protected final List getSQLQueryResult(String sql, Map parameterMap) {
  return getSQLQueryResult(sql, parameterMap, null);
  }
 2 protected final List getSQLQueryResult(String sql, Map parameterMap, Map entityMap){
   SQLQuery query = createSQLQuery(sql);
   if(entityMap != null){
     Iterator iter = entityMap.keySet().iterator();
     while (iter.hasNext()) {
      String key = (String) iter.next();
      query.addEntity(key, (Class) entityMap.get(key));
     }
    }
    setQueryParameters(query, parameterMap);
    return getQueryResults(query);
   }

 小结:
Hibernate查询:最后都是通过 org.hibernate.Query 类的list()方法得到查询结果,或者是 使用 spring提供的 HibernateDaoSupport类中的getHibernateTemplate().findByCriteria(criteria);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值