您的位置:首页 > 其它

getHibernateTemplate().find()及带参使用方法

2016-05-17 11:38 561 查看
转自:http://blog.sina.com.cn/s/blog_4586764e0100s157.html

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。
请知道原理的大侠们指点一二
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate hql