首页 > 其他分享 >(转)主题:Hibernate的检索策略

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

时间:2023-06-15 13:34:07浏览次数:32  
标签:检索 ... Hibernate Customer name 主题 list session result


立即检索    类级别的立即加载关联对象  关联级别的立即加载指定对象的关联对象 可以设定批量检索数量



延时检索    类级别的延时加载关联对象  关联级别的延时加载指定对象的关联对象 可以设定批量检索数量   
迫切左外连接检索  类级别不适用 关联级别通过左外连接加载与检索方法指定对象关联的对象
 
涉及到的元素属性
<class> 和 <set> 的 lazy  默认是 true  表示延时检索
<many-to-one><one-to-one><set> 的 outer-join 默认 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());
                        }


总的来说就是将显示时间 和 数据库的时间都进行转化 然后进行比较

标签:检索,...,Hibernate,Customer,name,主题,list,session,result
From: https://blog.51cto.com/u_16065168/6486316

相关文章

  • 如何在Spring Boot中使用Hibernate Natural ID
    首先,让我们关注所需类的实现。完成所有这些后,我们将能够为具有自然ID的实体提供存储库。用自然ID编写实体让我们考虑以下具有自动生成ID和自然ID(code列)的实体。这只是一个使用一个自然ID的典型实体@NaturalId:@实体publicclassProductimplementsSerializable{priva......
  • 为什么AirtestIDE的selenium Window突然无法检索控件了?
    1.前言最近有很多朋友跟我们反馈,为什么1.2.15版本的IDE没办法做网页元素检索了,是不是我们不支持selenium了之类的。测试后发现,目前版本确实存在这个问题,原因是Chrome113.0.5672.127(最新)版本过高,AirtestIDE1.2.15暂未兼容。2.问题表现1)无法检索控件我们尝试使用Airtest1.2......
  • 利用Binary Hash Codes的深度图像检索
    1.概述本文的重点:图像的binaryhashcode的生成方法两阶段的检索方法——coarse-to-finesearchstrategy2.基于内容的图像检索2.1.基于内容的图像检索基于内容的图像检索(Content-basedImageRetrieval,CBIR)旨在通过对图像内容的分析搜索出相似的图像,其主要的工作有如下两点:图像......
  • Hibernate @Transient
    @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic示例: //根据birth计算出age属性 @TransientpublicintgetAge(){<spanstyle="font-fa......
  • JavaScript中数组(Array)与对象(Object)中的检索方式
    这里只是要说明一点,数组(Array)和对象(Object)都可以用[...]的方式来进行检索[...]中包含的需要是一个表达式,这个表达式的值最终会以字符串的形式被使用因为不论是数组(Array)还是对象(Object),他们都是以键值对的形式存储内容的,而所有的键的数据类型都是字符串(Array好像不是,但是先这样......
  • 基于 hugo 和 papermod 主题搭建自己的博客
    部署博客到vercelFreeNom申请域名首先,梯子最好选择美国的,并且freenom选择地址时最好与ip所在州可以对应得上;进入FreeNom,输入zwyb.tk,然后点击检查可用性,这里要记得输入后缀,能避免点击现在获取显示不可用的问题。如下图所示:Cloudfare管理域名cloudfare添加站点zwyyy456.ml,然......
  • 为 papermod 主题添加 Latex 支持
    stepstofollow在themes/PaperMod/layouts/partials目录下创建math.html文件,文件内容如下<linkrel="stylesheet"href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css"integrity="sha384-bYdxxUwYipFNohQlHt0bjN/LCpueqWz13HufFEV1SUatK......
  • mac 改变默认终端主题
    oh-my-zshsh-c"$(curl-fsSLhttps://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"修改背景颜色打开终端右键背景-》检查显示器-》双击喜欢的背景-》设置默认......
  • 重磅再推 | 基于OpenSearch向量检索版+大模型,搭建对话式搜索
    面向企业开发者的PaaS方案一周前,阿里云OpenSearch发布的LLM智能问答版,面向行业搜索场景,提供企业专属问答搜索服务。作为一站式免运维的SaaS服务,智能问答版基于内置的LLM大模型提供问答能力,为企业快速搭建问答搜索系统,详见链接:<https://developer.aliyun.com/article/1239380>除了Sa......
  • jpa hibernate 下配置ehcache
    评:spring+jpa(hibernate实现)配置Ehcache,如何获取ehcache统计信息1.<beanid="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">2.<propertyname="dataSource"ref="dbcpDataS......