天天看点

Hibernate日常应用的相关问题

默认情况下,hibernate的sql中都是以问号代表参数,并没有显示参数的真实值,但是也不是做不到,只需要两步配置就可以显示出参数的真实值了:

(1)spring的配置文件中增加: 

<prop key="hibernate.show_sql">true</prop> 

或者在hibernate的配置文件中增加: 

<property name="show_sql">true</property>

(2)在log4j.properties中做如下配置: 

log4j.appender.stdout.threshold=trace 

log4j.category.org.hibernate.sql=trace 

log4j.category.org.hibernate.type=trace

在方法开始前spring通过动态代理,利用aop的方式,为普通要调用的方法在方法开始处添加事务控制,如果在方法中要进行save操作,则进行getsession。

在调用getsession()方法时,拿到数据库连接,如果在一个循环中多次调用save方法,因为spring会控制在一个事务中只有同一个session,

所以跟数据库的连接也只有一次,所以如果循环保存一个list,在service层循环和在dao层循环都是一样的(spring事务是加在service层的情况)。

delete()方法用于从数据库中删除与java对象对应的记录。如果传入的参数是持久化对象,session就计划执行一个delete语句。

如果传入的参数是游离对象,先使游离对象被session关联,使它变为持久化对象,然后计划执行一个delete语句。

值得注意的是,session只有在清理缓存的时候的才执行delete语句。

此外,只有当调用session的close()方法时,才会从session的缓存中删除该对象。

例如以下代码先加载一个持久化对象,然后通过delete()方法将它删除:

1

2

3

4

5

6

7

<code>session session1 = sessionfactory.opensession();</code>

<code>transaction tx1 = session1.begintransaction();</code>

<code>// 先加载一个持久化对象</code>

<code>customer customer = (customer)session.get(customer.</code><code>class</code><code>, </code><code>new</code> <code>long(</code><code>1</code><code>));</code>

<code>session.delete(customer); </code><code>// 计划执行一个delete语句</code>

<code>txt1.commit(); </code><code>// 清理缓存,执行delete语句</code>

<code>session.close();子</code><code>// 从缓存中删除customer对象</code>

以下代码直接通过delete()方法删除一个游离对象:

<code>session session2 = sessionfactory.opensession();</code>

<code>transaction tx2 = session1.begintransaction();</code>

<code>// 假定customer是一个游离对象,先使它被session关联,使它变为持久化对象,</code>

<code>// 然后计划执行一个delete语句</code>

<code>session2.delete(customer);</code>

<code>tx2.commit(); </code><code>// 清理缓存,执行delete语句</code>

<code>session2.close(); </code><code>// 从缓存中删除customer对象 </code>

如果希望删除多个对象,可以使用另一种重载形式的delete()方法:

<code>session.delete(</code><code>"from customer as c where c.id&gt;8"</code><code>);</code>

以上delete()方法的参数为hql查询语句,delete()方法将从数据库中删除所有满足查询条件的记录。

1.     使用hql语句

query q = session.createquery("select e from com.sun.demo.emp e");

2.     使用load方法(主键查询)

emp e = (emp)session.load(emp.class, 1141);

3.     使用get方法(主键查询)

emp e = (emp)session.get(emp.class, 1141);

4.     参数化查询(使用?通配符,或者命令通配符)

8

<code>query q = session.createquery(</code><code>"update userinfo set ename='aaa' where ename=?"</code><code>);</code>

<code>       </code><code>q.setparameter(</code><code>0</code><code>, </code><code>"smith"</code><code>);</code>

<code>query q = session.createquery(</code><code>"update userinfo set ename='aaa' where ename like ?"</code><code>);</code>

<code>       </code><code>q.setparameter(</code><code>0</code><code>, </code><code>"%m%"</code><code>);</code>

<code>query q = session.createquery(</code><code>"update userinfo set ename='aaa' where ename like :lkename"</code><code>);</code>

<code>       </code><code>q.setparameter(</code><code>"lkename"</code><code>, </code><code>"%l%"</code><code>);</code>

  

5.     命名查询

<code>&lt;</code><code>query</code> <code>name="myquery"&gt;</code>

<code> </code><code>&lt;![cdata[ from com.sun.hibernate.employer where job = ?]]&gt;</code>

<code>&lt;/</code><code>query</code><code>&gt;</code>

<code>query q = session.getnamedquery(</code><code>"myquery"</code><code>);</code>

<code>q.setparameter(</code><code>0</code><code>, </code><code>"manager"</code><code>);</code>

6.     属性查询

query q = session.createquery("select max(sal) from employer e where sal is not null");

query q = session.createquery("select distinct job from employer e");

7.     实例化查询

步骤如下:

1.编写你的hql语句

2.创建普通的java类 -------------------与pojo类不同,它与数据库没有任何关系

3.在该java类中你需要创建和查询结果对应的字段

4.在该java类中,你需要创建合适的构造函数

5.完善你的hql语句,使用实例化查询的方式进行包装

6.通过list.get(i)获取的结果就不再是一个数组,而是一个包装后的对象

例子:

<code>query q = session.createquery(</code><code>"select new com.sun.demo.userdate(ename,sysdate) from userinfo"</code><code>);</code>

<code>list list = q.list();</code>

<code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i&lt;list.size();i++){</code>

<code>       </code><code>userdate u = (userdate)list.get(i);</code>

<code>       </code><code>system.out.println(u.getename());</code>

<code>}</code>

8.     多态查询

对于pojo来说,java中的这种关系被扩展到了数据库表中

hibernate在查询一个表的同时,会检查该表所对应的pojo类有没有子类,如果有,一起查询出来

9.     分页查询

//查询第三到五条

              q.setfirstresult(3);//从第三条开始

              q.setmaxresults(3);//提取三条

10.  uniqueresult方法查询(查询结果只能是一个字段)

query q = session.createquery("select count(*) from employer");

long count = (long)q.uniqueresult();

11.  criteria查询(通过面向对象化的设计,将数据查询条件封装为一个对象)

9

10

11

12

13

14

15

16

17

<code>criteria c = session.createcriteria(employer.</code><code>class</code><code>);</code>

<code>       </code><code>c.addorder(order.asc(</code><code>"sal"</code><code>));      </code><code>//按薪水升序查询</code>

<code>       </code><code>c.setfirstresult(</code><code>3</code><code>);</code>

<code>       </code><code>c.setmaxresults(</code><code>3</code><code>);</code>

<code>       </code><code>list list = c.list();</code>

<code>       </code><code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i&lt;list.size();i++){</code>

<code>           </code><code>employer emp = (employer)list.get(i);</code>

<code>           </code><code>system.out.println(emp.getename() + </code><code>" : "</code> <code>+ emp.getsal());</code>

<code>       </code><code>}</code>