(转)主题:Hibernate的检索策略

news/2024/8/28 1:01:51
立即检索    类级别的立即加载关联对象  关联级别的立即加载指定对象的关联对象 可以设定批量检索数量
延时检索    类级别的延时加载关联对象  关联级别的延时加载指定对象的关联对象 可以设定批量检索数量   
迫切左外连接检索  类级别不适用 关联级别通过左外连接加载与检索方法指定对象关联的对象
 
涉及到的元素属性
<class>
<set> lazy  默认是 true  表示延时检索
<many-to-one><one-to-one><set>
outer-join             <many-to-one><one-to-one> 默认 auto    <set> 默认    false     
<class>
<set> batch-size 默认 1 指定批量检索的数量            
延时检索时会产生代理类
但是仅仅初始化了 OID 其他都为 null
只有当访问除 ID 外的属性 或者修改时才会加载数据库的数据
有可能在你关闭 session 后仍没有初始化对象 也就没有完整的游离对象   
只有在 session 范围内才能被初始化
'  get()
方法加载的对象时实际相关数据 不是代理类
一对多和多对多的检索策略
<set>
lazy out-join
都为 false 立即检索
lazy
false out-join true 是迫切左外连接检索 ( 当有多个 <set> 只允许一个用 )
相反时 用延时检索策略
                                                    Hibernate 的检索方式
HQL 检索方式:  
      1 
通过 Session createQuery() 方法创建一个 Query 对象 包含一 HQL 查询语句
      2 
可以动态绑定参数
      3 
可以调用 list() 方法返回 List 类型的结果
exp :
      List result = session.createQuery(".......").setString("name",name).setInteger("age", 21).list();

QBC 检索方式:
      1 
session 的才 createCriteria() 方法创建一个 Criteria 对象
      2 
可以设定查询的条件 Expression 的一些静态方法 Expression.like("name", "T%")
               Expression.eq("age", new Integer(21)
      3 
可以使用方法链 也可以调用 list() 方法返回 List 类型的结果
exp :
      List result = session.createCriteria(Customer.class).add(Restrictions.like("name", "T%")).add(Restrictions.eq("age", new Integer(21)).list();
      4 
还可以使用 QBE 模板检索方式
exp :
      Customer exp = new Customer();
      exp.setName("tom");
      List result =session.createCriteria(Customer.class).add(Example.create(exp)).list();
SQL 检索方式:
Query query=session.createSQLQuery("..............");

由于检索和 HQL 比较杂乱分别举例说明
' 最简单的查询
HQL
Session session=sessionFactory.openSession();
                Transaction tx=
null;
                
try
                
...{
                        tx=session.beginTransaction();
                        
                        List result=session.createQuery("from Customer ").list();
                        
for(Iterator it=result.iterator(); it.hasNext();)
                        
...{
                                Customer c =(Customer)it.next();
                                System.out.println("Customer's name :" + c.getName());
                                System.out.println("Customer's age :" + c.getAge());
                        }
                        tx.commit();
                }
                
catch(Exception e)
                
...{
                        
if(tx!=null)
                        
...{
                                tx.rollback();
                        }
                        
throw e;
                }
BQC
 
...
List result=session.createCriteria(Customer.
class).list();
...
' 指定查询和命名别名
HQL
 
...
List result=session.createQuery("from Customer as c where name=:name").setString("name", "Tom").list();
...
BQC
 
...
List result=session.createCriteria(Customer.
class).add(Restrictions.eq("name", "Tom")).list();
...
' 对查询结果排序
desc 是降序
HQL
 
...
List result=session.createQuery("from Customer as c order by c.name").list();
List result=session.createQuery("from Customer as c order by c.name asc, c.age desc").list();
...
BQC
 
...
List result=session.createCriteria(Customer.
class).addOrder(Order.asc("name")).addOrder(Order.desc("age")).list();
...
' 在指定时间范围内查询结果
 
...
                      tx=session.beginTransaction();
                        Date beginDate=java.sql.Date.valueOf("2006-8-1");
                        Date endDate=java.sql.Date.valueOf("2006-9-1");
                        List result=session.createQuery("from Customer c where c.retime <:endTime and c.retime >=:beginTime").setTimestamp("endTime", endDate).setTimestamp("beginTime", beginDate).list();
...
' 分页查询
HQL
...
List result=session.createQuery("from Customer c Order by c.name asc").setFirstResult(0).setMaxResults(3).list();
...
 
BQC
 
...
List result=session.createCriteria(Customer.
class).addOrder(Order.asc("name")).setFirstResult(0).setMaxResults(3).list();
...
' 检索单个对象
uniqueResult() 方法
如果不确定返回的时单个对象先用 Query Criteria serMaxResult(1) 方法 设定只返回一个对象
如果确定只返回一个对象 比如 from Customer c where c.id 1
' HQL 的两种绑定查询
1
 
session.createQuery("from Customer c where c.name=:name and c.age=:age").setString("name", "tom").setInteger("age", 20)
2
 
session.createQuery("from Customer c where c.name=? and c.age=?").setString(0, "tom").setInteger(1, 20)
' 特殊绑定方法
1
setEntity() 
可以绑定实体对象
 
session.createQuery("from Order o where o.customer=:customer").setEntity("customer", customer)
2
setParameter
绑定任意类型的参数
 
Query query=session.createQuery("from Order o where o.customer=:customer and o.orderNumber like: orderNumber ");
query.setParameter("customer", customer, Hibernate.entity(Customer.
class));
query.setParameter("orderNumber", orderNumber, Hibernate.STRING)
3
setProperties()
与一个对象的属性绑定
 
Customer customer = new Customer();
customer.setName("Tom");
customer.setAge(21);
List result=session.createQuery("from Customer c where c.name=:name and c.age=:age").setProperties(customer).list();
' 设定查询条件
' 比较运算 大于某个条件
HQL
 
...
List result=session.createQuery("from Customer c where c.age>23").list();
...
BQC
 
...
List result=session.createCriteria(Customer.
class).add(Restrictions.gt("age", new Integer(23))).list();
...
' 比较运算 不等于某个条件
HQL
...
List result=session.createQuery("from Customer c where c.age<>24").list();
...
BQC
 
...
List result=session.createCriteria(Customer.
class).add(Restrictions.not(Restrictions.eq("age", new Integer(23)))).list();
...
' 比较运算 条件为 null 的某个对象
HQL
 
...
List result=session.createQuery("from Order o where o.customer is null").list();
...
 
BQC
 
...
List result=session.createCriteria(Order.
class)
                                .add(Restrictions.isNull("customer")).list();
...
' 范围运算 检索在某个范围内 String
HQL
 
...
List result=session.createQuery("from Customer c where c.name in('Tom','Mike','Jack')").list();
...
BQC
 
...
String[] names=
...{"Tom", "Mike", "Jack"};
List result=session.createCriteria(Customer.
class)
  .add(Restrictions.in("name", names)).list();
...
' 范围运算 检索在某个范围内 Integer
HQL
 

...
List result=session.createQuery("from Customer c where c.age between 24 and 30").list();
...
 
BQC
...
List result=session.createCriteria(Customer.
class)
.add(Restrictions.between("age", 
new Integer(24), new Integer(30))).list();
...
不在某个范围内
HQL
 
...
List result=session.createQuery("from Customer c where c.age not between 24 and 30").list();
...
 
BQC
 
...
List result=session.createCriteria(Customer.
class)
.add(Restrictions.not(Restrictions.between("age", 
new Integer(24), new Integer(30)))).list();
...
' 范围运算 字符串通配符
T 开头
HQL like 'T%'  
BQC add(Restrictions.like("name","T%"))
T 结尾
HQL like '%T'
BQC add(Restrictions.like("name","%T"))
包含 T
HQL like '%T%'
BQC add(Restrictions.like("name","%T%"))
控制长度为 3
HQL like 'T_ _'
BQC add(Restrictions.like("name","T_ _"))
另外
Restrictions
还有这样的方法 like(java.lang.String propertyName, java.lang.String value, MatchMode matchMode)
有一些定义好的 field 具体查看 API
' 逻辑运算 检索 复杂条件
条件结合
HQL
 
...
List result=session.createQuery("from Customer c where c.name like 'T%' and c.name like '%m'").list();
...
BQC
 
...
List result=session.createCriteria(Customer.
class)
.add(Restrictions.like("name", "T%")).add(Restrictions.like("name", "%m")).list();
...
逻辑与
Restriction
有如下方法
or(Criterion lhs, Criterion rhs)
and(Criterion lhs, Criterion rhs
HQL
 
...
List result=session.createQuery("from Customer c where (c.name like 'T%' and c.name like '%m') or (c.age not between 20 and 25)").list();
...
BQC
 
...
List result=session.createCriteria(Customer.
class).add(Restrictions.or(Restrictions.and(Restrictions.like("name", "T%"), Restrictions.like("name", "%m")), Restrictions.not(Restrictions.between("age", new Integer(20), new Integer(25))))).list();
...
 
报表查询
from 关键字是必须 select group by having 用于报表查询
投影查询 只检索出需要的字段
HQL
 
...
List result=session.createQuery("select c.id, c.name, o.orderNumber from Customer c join c.orders o where o.orderNumber like 'T%'").list();
                        Iterator it=result.iterator();
                        
while(it.hasNext())
                        
...{
                                Object[] row=(Object[])it.next();
                                Long id=(Long)row[0];
                                String name=(String)row[1];
                                String orderNumber=(String)row[2];
                                System.out.println(id+" "+name+" "+orderNumber);
                        }
...
这个 list 返回的结果是集合 存放的是关系数据
也可以建立一个 javabean 来让结果更清晰
 
...
select 
new ergal.CustomerRow(c.id, c.name, o.orderNumber) from Customer c join c.orders o where o.orderNumber like 'T%'
...

while(it.hasNest())
...{
        CustomerRow cr=(CustomerRow)it.next();
        Long id=(Long)cr.getId();
        ......
}
 
分组查询
查询相同姓名的的记录
 
...
List result=session.createQuery("select  c.name, count(c) from Customer c group by c.name").list();
                        Iterator it=result.iterator();
                        
while(it.hasNext())
                        
...{
                                Object[] row=(Object[])it.next();
                                String name=(String)row[0];
                                Long id=(Long)row[1];
                                System.out.println(id+" "+name);
                        }
...
统计订单数目
 
...
List result=session.createQuery("select  c.id, c.name, count(o) from Customer c join c.orders o group by c.id").list();
                        Iterator it=result.iterator();
                        
while(it.hasNext())
                        
...{
                                Object[] row=(Object[])it.next();
                                Long id=(Long)row[0];
                                String name=(String)row[1];
                                Long num=(Long)row[2];                                
                                System.out.println(num+" "+name+" "+id);
                        }
...
统计每个客户的订单总价 - 右外连接
 
...
List result=session.createQuery("select  c.id, c.name, sum(o.price) from Customer c right outer join c.orders o group by c.id").list();
                        Iterator it=result.iterator();
                        
while(it.hasNext())
                        
...{
                                Object[] row=(Object[])it.next();
                                Long id=(Long)row[0];
                                String name=(String)row[1];
                                Double num=(Double)row[2];                                
                                System.out.println(num+" "+name+" "+id);
                        }
...
统计每个客户的订单总价 - 加条件 订单大于一的
 
...
List result=session.createQuery("select  c.id, c.name, sum(o.price) from Customer c join c.orders o group by c.id having(count(o)>1)").list();
                        Iterator it=result.iterator();
                        
while(it.hasNext())
                        
...{
                                Object[] row=(Object[])it.next();
                                Long id=(Long)row[0];
                                String name=(String)row[1];
                                Double num=(Double)row[2];                                
                                System.out.println(num+" "+name+" "+id);
                        }
...
 
查询时间段
 
            tx=session.beginTransaction();
            Date beginDate=java.sql.Date.valueOf("2006-8-1");
            Date endDate=java.sql.Date.valueOf("2006-9-1");
            List result=session.createQuery("from Customer c where c.retime <:endTime and c.retime >=:beginTime").setTimestamp("endTime", endDate).setTimestamp("beginTime", beginDate).list();
             
for(Iterator it=result.iterator(); it.hasNext();)
                        
...{
                                Customer c =(Customer)it.next();
                                System.out.println("Customer's name :" + c.getName());
                                System.out.println("Customer's regiestertime :" + c.getRetime());
                        }
总的来说就是将显示时间 数据库的时间都进行转化 然后进行比较

http://www.niftyadmin.cn/n/1734210.html

相关文章

学生成绩系统python3源程序_学生成绩管理系统(python)的实现

学生成绩管理系统功能&#xff1a;增&#xff0e;删&#xff0e;改&#xff0e;查&#xff0e;排序&#xff0e;这五个部份组成&#xff0e;均由单独的函数完成&#xff0e;其中信息的存取均以字典形式表达&#xff0e;#student_info.py#插入学生信息def input_student():info…

spring事务概要

Spring框架是一个2003年2月才出现的开源项目&#xff0c;该开源项目起源自Rod Johnson在2002年末出版的《Expert One-on-One J2EE Design and Development》一书中的基础性 代码。在该书中&#xff0c;Rod Johnson倡导J2EE实用主义的设计思想&#xff0c;而Spring框架正是这一思…

angular js创建表单_AngularJS中的表单验证

AngularJS中的表单验证AngularJS自带了很多验证&#xff0c;什么必填&#xff0c;最大长度&#xff0c;最小长度...&#xff0c;这里记录几个有用的正则式验证Note that novalidate is used to disable browsers native form validation. 用来禁用H5的原生验证.1.使用angularjs…

ros编写自己的msg(Python)

这里&#xff0c;假设我们的包名叫做test_py. 我们写自己的msg文件在该包的msg文件夹下。 test.msg float32[] data然后&#xff0c;我们编写自己的talker.py文件如下: #!/usr/bin/env pythonimport rospy #from后边是自己的包.msg&#xff0c;也就是自己包的msg文件夹下&…

linux 全局描述符 详解,操作系统篇之-全局描述符表格(GDT Global Descriptor Table)...

Windows&#xff0c;RedHat等通用型操作系统都是工作在保护模式下面。他们的存储机制是段式存储&#xff0c;这种机制是通过段寄存器(386以上的CPU的段寄存器是gdtr)和GDT中的描述符共同提供的。操作系统维护着一个结构书组&#xff0c;数组里面每个元素就是一个GDT全局描述符&…

J2EE下使用AJAX(一) 最原始的AJAX (转)

新一篇: J2EE下使用AJAX(二) Prototype封装 本方法不借助于任何的框架及开源项目&#xff0c;体现AJAX在J2EE中的实现如下功能&#xff0c;由页面向服务器发出请求&#xff0c;返回一个字符串&#xff0c;客户端页面显示该字符串。1.1 Servlet 响应客户端请求的Servlet类为一普…

在统计学中_统计学中的基本概念

- 1 -1.2统计学的几个基本概念1.2.1总体和总体单位1.总体(1)总体的概念&#xff1a;总体是指客观存在的、具有某种共同性质的许多个别事物组成的整体&#xff1b;在统计研究过程当中&#xff0c;统计研究的目的和任务居于支配和主导的地位&#xff0c;有什么样的研究目的就应该…

android 音频播放过程,一种Android系统中的音频播放方法与流程

本申请涉及android系统技术&#xff0c;特别涉及一种android系统中的音频播放方法。背景技术&#xff1a;在android系统中&#xff0c;现有的使用audiotrack进行音频播放时&#xff0c;audiotrack应用与android系统平台的交互过程如图1所示&#xff0c;在图1中&#xff0c;minb…