火星文 技术研习社

Noname Cat, Keep Thinking
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Hibernate3 的 HQL 和 createQuery 及 Session 应用

Posted on 2006-04-10 21:59  剑廿三  阅读(1944)  评论(0编辑  收藏  举报
框架:Struts 1.2, Hibernate 3
环境:MyEclipse 4.0
 
一. JDBC 连接字
 
某个测试站点从昨天中午忙活到今天上午,一直不知道因为何事不能从数据库 bookstore 的 account 表读出第一条记录。一直以为是程序的问题,可是把程序改到面目全非仍然是mappingForward到了“出错了”页面。
 
苦恼中打开 hibernate.cfg.xml ,赫然发现里面的 JDBC 连接字是:
 
jdbc:mysql://localhost/webases
 
立马晕倒。改成 jdbc:mysql://localhost/bookstore 这样就好了。
 
看来,JDBC 连接字理应作为第一个排错的目标,尤其在 MyEclipse 环境里。
 
二. 用 HQL 和 createQuery 直接取出 PO 对象
 
如果 HQL 写成 select account from Account as account where account.name='admin'
这是会出错的,因为 select 后面不能直接跟对象名。用 Account 也是同样的错误。
 
如果 HQL 写成 select account.userid,account.name,account.password from Account as account where account.name='admin'
这也是错的,因为得出的 Quey 结果并不是 account 对象,而只能是逐个取值的数组。
 
只有当 HQL 写成 “ from Account as account where account.name='admin' ”
这时的 Query q.list().get(0) 才是一个 Account 类型的 PO 对象。
 
三. 在 JSP 上调试 createQuery 结果
 
可以在 JSP 页面上调试 Hibernate 的查询结果,以避开复杂的业务逻辑。
 
<%  org.hibernate.Session s = HibernateSessionFactory.currentSession();
  String hql = " from Account where name='admin'";
  try {
   org.hibernate.Query query = s.createQuery(hql);
   out.println(query.getQueryString());
   java.util.List msgList = query.list();
   Account account = (Account) msgList.get(0);
   out.println(account.getUserid());
   out.println(account.getName());
   out.println(account.getPassword());
     
  } catch (org.hibernate.HibernateException e) {
   e.printStackTrace();
  }  
  HibernateSessionFactory.closeSession();  
%>
 
四. 存取 Session
 
存:(Java)
 
session.setAttribute(Constants.USER_KEY, account.getName());
 
这个 session 是 Hibernate 产生的 session。
 
取:(JSP)
 
我的用户名:
    <% 
    String myname = (String) session.getAttribute(Constants.USER_KEY);
    out.println(myname);
    %>