find(String queryString, Object[] values);

这个方法后者的参数必须是一个数组,而不能是一个List。

List ul=getHibernateTemplate().find("from User u where u.username=? and u.password=?",new String[]{user,pass});

其中User是对应的类名,不是数据库中的表名。

如何访问数据库?我们有两个选择:

getSession().createQuery("from Users");

getHibernateTemplate().find( "FROM Users);

用哪个呢?困惑啊。

网上找了找资料都是推荐用getHibernateTemplate,原因说的不是很清楚。

于是做了如下测试:分别循环调用getSession().createQuery("from Users");getHibernateTemplate().find( "FROM Users);

1000次结果getSession()很快就包无法建立连接了。而getHibernateTemplate屁事没有可以跑完。通过后台观察,使用getSession会在数据库中留下很多SQL*Net message from client的连接,终止测试后连接自动释放。而getHibernateTemplate则从头到尾都使用一个连接。难道是getSession()不会自动释放连接?于是我又分别循环调用getSession().createQuery("from Users");getHibernateTemplate().find( "FROM Users); 5次发现当前端程序一结束,getSession的5个连接立刻就释放了。结合前面1000次时终止测试后连接自动释放,可以说明getSession()是会自动释放连接的。

结论:

(1)getSession()和getHibernateTemplate都可以自动释放连接(当然你的配置要正确),但是在一个线程内 getSession会get很多个session(就是开很多个会话、连接),很可能导致数据库连接超过上限。所以推荐使用 getHibernateTemplate。

(2)如果有些语句无法用getHibernateTemplate实现,可以使用 getHibernateTemplate.execute使用 HibernateCallback回调接口。另:可以设定HibernateTemplate的AllowCreate为True,并在finally 中关闭Session。也可以将true作为参数传递到super.getSession(..)方法中取得Session。这样也可以,就是麻烦点。

参数绑定

通过顺序占位符?来填充参数:

1)hibernate 2 中通过session.find方法来填充

session.find("from TUser user where user.name=?", "Erica", Hibernate.STRING);

多个参数的情况:

Object[] args = new Object[] {"Erica", new Integer(20)};
Type[] types = new Type{Hibernate.STRING, Hibernate.INTEGER};
session.find("from TUser user where user.name=? and user.age=?", args, types);

2)通过Query接口进行参数填充:

Query query = session.createQuery("from TUser user where user.name=? and user.age>?");
query.setString(0,"Erica");
query.setInteger(1, 20);

通过引用占位符来填充参数:

String hql = "from TUser where name=:name";
Query query = session.createQuery(hql);
query.setParameter("name","Erica");

如何把两个时间类型的参数传递到find的第二个参数

public List findAll(Date begin, Date end) throws Exception {
     String hql="from Salebill where saleDate bewteen ? and ?";
     Object[] value={begin,end};
     List list = this.getHibernateTemplate().find(hql, value);
     return list;

List moreCats = this.getHibernateTemplate().find(
     "from Cat as cat where " +   "cat.name = 'Fritz' or cat.id = ? or cat.id = ?",
     new Object[] { id1, id2 },
     new Type[] { Hibernate.LONG, Hibernate.LONG }
);

public AuctionUser findUserByItemAndPrice(Integer itemId , Double price)
 {
  Object[] args = {itemId , price} ;
        List l = getHibernateTemplate().find("from Bid as bid where bid.bidItem.id = ? and bid.bidPrice = ?",args);
  if (l.size() >= 1)
  {
   Bid b = (Bid)l.get(0);
   return b.getBidUser();
  }
  else
  {
   return null;
  }

}

ps:在网上查用getHibernateTemplate().find()方法有时候会出现问题
1.如果数据库没有设置主键,并且数据里有为Null的字段时,返回的list.size()不为0,但get的时候却为NULL

2.有的时候用?进行传参返回结果也是NULL。
请知道原理的大侠们指点一二

getHibernateTemplate().find()的更多相关文章

  1. 利用getHibernateTemplate实现简单的操作

    package org.tarena.dao; import java.sql.SQLException; import java.util.List; import javax.annotation ...

  2. 【转】getHibernateTemplate出现的所有find方法的总结

    一.find(String queryString); 示例:this.getHibernateTemplate().find("from bean.User"); 返回所有Use ...

  3. getHibernateTemplate()的用法

    getHibernateTemplate() spring 中获得由spring所配置的hibernate的操作对象,然后利用此对象进行,保存,修改和删除等操作,此方法是在配置了spring以后,hi ...

  4. ssh中getHibernateTemplate()的方法

    spring接着又把业务类中的查询也封装成了find() //用来实现分页 /*HibernateTemplate ht=this.getHibernateTemplate(); DetachedCr ...

  5. getHibernateTemplate()为NUll

    getHibernateTemplate()为NUll,困扰好几天了,网上也找了好些方法一直解决不掉15 小弟刚刚开始学SSH,是用的Struts2+Hibernate+Spring,运行的时候发现g ...

  6. getHibernateTemplate().find方法详解

    Spring中常用的hql查询方法(getHibernateTemplate()) --------------------------------- 一.find(String queryStrin ...

  7. Spring中常用的hql查询方法(getHibernateTemplate())

    一.find(String queryString); 示例:getHibernateTemplate().find("from bean.User"); 返回所有User对象 二 ...

  8. getHibernateTemplate()和getSession()的区别

    自动生成hibernate配置文件的时候,会在dao层用到getSession()方法来操作数据库记录,但是他还有个方法getHibernateTemplate(),这两个方法究竟有什么区别呢? 1. ...

  9. getHibernateTemplate()

    getHibernateTemplate 前提条件:你的类必须继承HibernateDaoSupport 一: 回调函数: public List getList(){   return (List ...

随机推荐

  1. ajax数据显示,使用js通用模板

    最近用ajax获取数据,上级要求要自己写一个js模板,以往看到的js模板,大都数都是在js里面拼接的,现在换一种比较简单的写法, 通过ajax获取数据源,js模板循环显示数据 function Get ...

  2. Cannot initialise keyboard run ./nano-X

    其中之一解决方案为: ./xinit

  3. A+B II

    Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...

  4. C语言基础07

    结构体与函数的区别: 1.函数是由相同数据类型的变量组成. 2.结构体可以有不同数据类型组合.可以包含char,int,float,数组等类型. struct 结构名称 { 数据类型 成员:   注意 ...

  5. javascript 跨域汇总

    什么是跨域?当两个域具有相同的协议.相同的端口.相同的host时,那么我们就可以认为它们是相同的域.比如:http://www.example.com/a.html 和 http://www.exam ...

  6. YY的困境:除了终止私有化 还有更多的担忧

    界面 刘莎 已大热一段时间的中概股私有化浪潮随着中国股市的下跌而降温,很多在美上市的中概股不得不因此叫停私有化,欢聚时代(下称YY)首当其冲,成为私有化大军中首个被迫撤退的中资公司. 虽然从表面看,私 ...

  7. instsrv.exe下载和使用方法(微软Windows Server 2003 Resource Kit Tools工具中的一个)

    instsrv.exe是微软Windows Server 2003 Resource Kit Tools工具中的一个. Windows Server 2003 Resource Kit Tools是一 ...

  8. Check .NET Version with Inno Setup

    原文 http://www.kynosarges.org/DotNetVersion.html Inno Setup by Jordan Russell is a great installation ...

  9. OpenSSL win 下报错 OPENSSL_Uplink(58D46000,08): no OPENSSL_Applink

    python 中使用 M2Crypto 想读写文件时总是报: OPENSSL_Uplink(58D46000,08): no OPENSSL_Applink windows 平台下使用 openssl ...

  10. 国内5款优秀的WEB前端框架

    1. JX(腾讯) 官网地址:http://alloyteam.github.io/JX/#home JX 是一个类似 Google Closure Library 的 Web 前端开发框架,服务于 ...