getHibernateTemplate().find()
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)}; |
2)通过Query接口进行参数填充:
|
Query query = session.createQuery("from TUser user where user.name=? and user.age>?"); |
通过引用占位符来填充参数:
|
String hql = "from TUser where name=:name"; |
如何把两个时间类型的参数传递到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()的更多相关文章
- 利用getHibernateTemplate实现简单的操作
package org.tarena.dao; import java.sql.SQLException; import java.util.List; import javax.annotation ...
- 【转】getHibernateTemplate出现的所有find方法的总结
一.find(String queryString); 示例:this.getHibernateTemplate().find("from bean.User"); 返回所有Use ...
- getHibernateTemplate()的用法
getHibernateTemplate() spring 中获得由spring所配置的hibernate的操作对象,然后利用此对象进行,保存,修改和删除等操作,此方法是在配置了spring以后,hi ...
- ssh中getHibernateTemplate()的方法
spring接着又把业务类中的查询也封装成了find() //用来实现分页 /*HibernateTemplate ht=this.getHibernateTemplate(); DetachedCr ...
- getHibernateTemplate()为NUll
getHibernateTemplate()为NUll,困扰好几天了,网上也找了好些方法一直解决不掉15 小弟刚刚开始学SSH,是用的Struts2+Hibernate+Spring,运行的时候发现g ...
- getHibernateTemplate().find方法详解
Spring中常用的hql查询方法(getHibernateTemplate()) --------------------------------- 一.find(String queryStrin ...
- Spring中常用的hql查询方法(getHibernateTemplate())
一.find(String queryString); 示例:getHibernateTemplate().find("from bean.User"); 返回所有User对象 二 ...
- getHibernateTemplate()和getSession()的区别
自动生成hibernate配置文件的时候,会在dao层用到getSession()方法来操作数据库记录,但是他还有个方法getHibernateTemplate(),这两个方法究竟有什么区别呢? 1. ...
- getHibernateTemplate()
getHibernateTemplate 前提条件:你的类必须继承HibernateDaoSupport 一: 回调函数: public List getList(){ return (List ...
随机推荐
- avalon前端js直接通过ajax请求传一个对象到后台
代码如下: //企业开票信息 vm.invoiceInfo = { companyId : "", //企 ...
- MysqlDataSource里的Connection实现类实现了isValid(int timeout)方法
在项目中,需要连接mysql数据库的时候,我们最好选择使用数据库连接池,即需要选择DataSource. 而在使用c3p0的ComboPooledDataSource时,发现它的Connection实 ...
- jquery 实现简单拖拽
$.fn.drag = function(obj) { var dragging = false; var oDrag = $(obj); oDrag.mousedown(function(e) { ...
- Python中各种集合 list tuple set dict
list 创建list L = ['Adam','Lucy','Bart'] 索引访问: 正序(和数组类似) L[0],L[1],L[2] 倒序 L[-1]倒数第一个 L[- ...
- C#操作XML的完整例子——XmlDocument篇(转载,仅做学习之用)
原文地址:http://www.cnblogs.com/serenatao/archive/2012/09/05/2672621.html 这是一个用c#控制台程序下, 用XmlDocument 进 ...
- 网易云课堂_C++程序设计入门(上)_第3单元:更上一层楼 – 超越C的语法_第3单元作业【3】-在线编程(难度:中;10分)
1 本题要求实现两个重载的swap函数,每个swap函数都可交换3个整数a,b,c的值.将a的值存入b,b的值存入c,c的值存入a, 并且返回三个整数中最大的数的值.例如a,b,c的值为1,2,3,则 ...
- UVA11387 - The 3-Regular Graph(推理)
题目链接 题意:给n个点,问能否画出一个无向图.且每一个顶点连接3条边.假设能够的话输出连接的边. 思路:当添加一条边时,总的无向图的度数会添加2,所以度数之和n*2为偶数.当n为奇数时,度数之和为奇 ...
- C++ STL源代码学习(map,set内部heap篇)
stl_heap.h ///STL中使用的是大顶堆 /// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap ...
- Parallels destop8 无法创建bootcamp虚拟机
创建基于Boot Camp的虚拟机时弹出“PRL_ERR_DISK_FILE_OPEN_ERROR (0x80021014)”错误提示,由于Mac系统权限错误或Boot Camp内Windows系统权 ...
- Sequence one(hdu2610dfs+去重)
题目:有一个数列N,和一个数字k,输出该数列的前k个子序列,如果k大于N的所有子序列,输出所有符合要求的序列,序列要求不能是递减序列 比如: 3 5 1 3 2 的前五个序列为 1 3 2 1 3 1 ...