注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

KSM的博客-只爱你一个

去年今日此门中,人面桃花相映红。人面不知何处去,桃花依旧笑春风。

 
 
 

日志

 
 

Hibernate 命名查询NamedQuery  

2011-10-09 17:55:53|  分类: java笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

配置方式:

static List namedQuery(int id) {
  Session s 
= HibernateUtil.getSession();
  Query q 
= s.getNamedQuery("getUserById");
  q.setInteger(
"id", id);
  
return q.list();
 }

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>
    
<class name="com.sy.vo.User" table="user" catalog="news">
    
 

    
</class>
    
<!-- 命名查询:定义查询条件 -->
    
<query name="getUserById">
     
<![CDATA[from User where id=:id]]>
    
</query>
    
<!-- 命名查询中使用sql,不推荐使用,影响跨数据库
    <sql-query name="getUserById2">
     <![CDATA[select * from User where ]]>
    </sql-query> 
-->
</hibernate-mapping>

标注方式:

标注方式是我们项目中用到的

 ,

@Entity
@NamedQueries( {
        @NamedQuery(name="Trade.findTotalPaymentAndBuyerNum",
                query = "select sum(payment),count(distinct t.buyerNick),sum(t.postFee),sum(t.num) from Trade t where t.payTime >= :start and t.payTime < :end and t.sellerNick = :sellerNick"),
        @NamedQuery(name="Trade.findCreatedPayments",
                query = "select sum(payment),count(distinct t.buyerNick),sum(t.num) from Trade t where t.created >= :start and t.created < :end and t.sellerNick = :sellerNick")})

public class  Trade {

。。。。

}

放在了类的前面,可以多个,有name跟query两个属性,而且query里面已经有了‘:start’这样的可以传递参数的。

其中一个Service的实现里面可以这样用:

public Object[] getTotalPaymentAndBuyerNum(String sellerNick, Date start, Date end) {
        Map<String, Object> queryParams = new HashMap<String, Object>();
        queryParams.put("sellerNick", sellerNick);
        queryParams.put("start", start);
        queryParams.put("end", end);
        List list = genericDao.findByNamedQuery("Trade.findTotalPaymentAndBuyerNum", queryParams);
        Object[] o = (Object[]) list.get(0);
        return o;
    }

genericDao的实现是继承了HibernateDaoSupport的:

public List<T> findByNamedQuery(String queryName, Map<String, Object> queryParams) {
        String[] params = new String[queryParams.size()];
        Object[] values = new Object[queryParams.size()];
        int index = 0;
        Iterator<String> i = queryParams.keySet().iterator();
        while (i.hasNext()) {
            String key = i.next();
            params[index] = key;
            values[index++] = queryParams.get(key);
        }
        return getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, params, values);
    }

适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。  缺点:不面向对象。基于hql和sql,有一定缺陷,第二种标注方式更简单易用,最主要是扩展性很强的,推荐用第二种方式方便开发。

  评论这张
 
阅读(9169)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018