博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate检索、排序(三)
阅读量:4261 次
发布时间:2019-05-26

本文共 4117 字,大约阅读时间需要 13 分钟。

4、hibernate检索策略

   

   1):立即检索(加载);session.get();query.list();缺点:sql语句太多。

   2): 延迟检索(加载);session.load();query.iterate();<set lazy = “true”>

   3): 在多对一关联级别中,默认情况下是使用左外连接检索策略。如果对Order.hbm.xml

       文件中的<many-to-one outer-join=true>表示总是使用左外连接。

       当使用代码:  

Order order = (Order)session.get(Order.class,new Long(1));

则hibernate产生的sql有:缺点:如果连接数据表很复杂,将会导致查询的深度很深,从而影响其查询性能,在hibernate可以配置检索的深度。

Select * from order left outer join customer on order.customer_id = customer.id where order.id = 1;
配置检索深度,需要在主配置文件中配置。
1

5、Hibernate查询排序

   1):数据库排序(推荐)

      在进行数据查询时就对数据进行排序。

      需要在hbm.xml文件中进行属性order-by属性的配置,其值为要进行排序的数据库字段进行asc desc进行排序。(可以同时进行多个字段的排序,相互之间用;隔开,<list>没有order-by属性)

   2):内存排序

       利用程序中的排序规则对数据进行排序

       需要在hbm.xml文件中进行属性sort属性的配置。

       Sort可以使用hibernate提供的值进行排序,也可以自定义排序规则。

如何自定义排序规则,如何引用?---需实现compare接口/** * 自定义比较器 */public class MyCompare implements Comparator
{@Overridepublic int compare(String o1, String o2){/** * 两者相等,返回0 * 前面的大,返回1 * 后面的大,返回-1 */if(o1.equals(o2)){return 0;}return 0;}}然后在hbm.xml文件中指定属性sort = “比较器类的全称”

10、Hibernate 联合主键配置

   利用hibernate生成联合主键

1):一种方式为在域模型中添加多个字段来映射成联合主键

    要求:作为联合主键的域模型必须实现serializable;

          必须重写该类的equals();与hashcode()方法,用于比较两个对象相等

            的条件。

Public class Student implements Serializable{Private String cardId;//联合主键之一Private String name;//联合主键之一Private int age;Public int hashCode(){    //将作为联合主键的属性进行hashcode比较}Public boolean equals(Object obj){   //将作为联合主键的属性进行equals比较}}

  当在对作为联合主键的对象进行保存时,如何联合主键是相同的,只会进行一次(第一次)数据库保存。

 

11、hibernate检索方式

   1):导航对象图检索方式;

   2):根据OID进行检索;(session.get();session.load();)

   3):HQL检索方式;

       

Query query = session.createQuery(“from Customer as c where c.name =:customerName and c.age =:customerAge”);//动态绑定参数--使用命名参数的方式(原子类型)query.setString(“customerName”,”Tom”);query.setInteger(“customerAge”,12);说明:其中在HQL语句中的=:后面的为自定义的名字,等同于一个占位符一样而后面的则是给自定义的名字动态的附上值。

 

如果是除原子类型外的参数传入??--Student、Team对象Team t = (Team)session.get(Team.class,new Long(1));Query query = session.createQuery(“from Student s where s.team = :team and s.age = :age”);//动态绑定原子类型query.setInteger(“age”,12);//绑定其他类型(一种方式)query.setParameter(“team”,t,Hiberante.entity(Team.class));//绑定其他类型(第二种方式)query.setEntity(“team”,t);

 

如果是除原子类型外的参数传入??--Student、Team对象Team t = (Team)session.get(Team.class,new Long(1));Query query = session.createFilter(t.getStudents,”where age =:age”);query.setInteger(“age”,23);

  对查询出结果对象的解说:

           1):返回的结果是完整的数据对象

               

Query query = session.createQuery(“from Customer”);List list = query.list();For(int i =0;i

 

          2):返回的结果不是完整数据对象(部分属性)

第一种方式:Query query = session.createQuery(“select c.name, c.age from Customer c”);              /*			 * 通过该条件返回的只有对象中的部分属性,那么他查询数据并不是			 * 一个个的对象,而是一个个游离的数据,也就是说以前通过list返回的		     *	一行记录构成一个完整的数据对象,list存放的一个个对象就是		     *	一个完整的对象。所以直接遍历然后类型转换即可。		     * 而对于查询的数据只是部分的数据就无法构成一个完成的对象,Hibernate处理是		     * 将查询出的一行数据(无法构成完整对象)将每一个字段包装成一个个object然后将整行		     * 对象放置在一个Object[]中。		     * 因此返回的一个个对象实际上是一个个Object[]			 */List list = query.list();For(int i=0;i

 

第二种方式:前提是必须重载构造函数(提供对应查询字段的构造函数)              /*			 * 希望即使是返回部分字段也是以完整对象的形式返回			 * 他将离散的值构成一个完整的对象返回.			 * 这种方式是需要模型类提供一个与查询部分字段相对应的构造函数。			 */Query query = session.createQuery(“select new Coustomer(c.name,c.age) from Customer c”);List
list = (List

 连接查询: (两张表以上的查询Team表,Student表)

          1):内连接查询(inner... join...on  或  join...on):

Select * from Team t inner join student s on t.id = s.id; 查询两表中符合条件的记录,可能两表的数据都有“丢失”现象
Hibernate会自动附上on 后面的查询条件Query query = session.createQuery(“from Team t join t.student”);

       2):左外连接(left ...join...on  或 left outter ...join ...on)

Select * from Team t left outter join Student on t.id = s.id;已左表为基准,会将左表所有的记录查出来,如果右表有符合条件的就查询,如果没有就用将对应的字段赋值为Null

      3):右外连接(right..join...on 或 right outter...join...on)与左外连接相反

4):QBC检索方式

这种检索方式主要由:Criteria接口、Criterion接口、Expression类组成,支持在运行时动态生成查询语句。Criteria c = session.createCriteria(Customer.class);//Criteria是针对模型进行查询List list = c.list();//增加查询条件Criterion cn= Expression.like(“name”,”T%”);Criterion cn2 = Expresion.eq(“age”,new Integer(21)); c = c.add(cn).add(cn2);List  result = c.list(); -产生的对应的sql--Select * from Customer c where c.name like “T%” and c.age = 21;

 

 

转载地址:http://ohxei.baihongyu.com/

你可能感兴趣的文章
JavaWeb之filter&listener&文件上传
查看>>
JavaWeb之Ajax&json
查看>>
BUFG,IBUFG,BUFGP,IBUFGDS等含义以及使用
查看>>
转载:在 Windows 10 下遇到移动硬盘不自动分配盘符的问题
查看>>
DDR2 SSTL_18标准
查看>>
DDR3的DQS_p/n信号电平摆幅变化不一致现象
查看>>
北大旁听生中的历史名人
查看>>
大唐凌烟阁开国廿四将
查看>>
Access数据库出现"Selected collating sequence not supported by the operating system."错误
查看>>
逻辑思维测试题
查看>>
如何用Easy CHM制作CHM格式电子书(帮助文档)
查看>>
为什么学习python
查看>>
华为进不了美国,并不是贸易保护这么简单
查看>>
markdown文件的基本常用编写语法(图文并茂)
查看>>
java变量简介
查看>>
Shell十分钟入门
查看>>
nginx 配置 upstream backup 报错
查看>>
Linux执行 wget命令:提示command not found的两种解决方法
查看>>
openssl实现md5加rsa签名
查看>>
史上最全的前端学习路线图,干货满满
查看>>