hibernate查询集合.docx
- 文档编号:10853476
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:71
- 大小:51.35KB
hibernate查询集合.docx
《hibernate查询集合.docx》由会员分享,可在线阅读,更多相关《hibernate查询集合.docx(71页珍藏版)》请在冰豆网上搜索。
hibernate查询集合
hibernateHQL查询使用详解
2010-06-3015:
30
HibernateQueryLanguage(HQL)提供了十分强大的功能,推荐大家使用这种查询方式。
HQL具有与SQL语言类似的语法规范,只不过SQL针对表中字段进行查询,而HQL针对持久化对象,它用来取得对象,而不进行update、delete和insert等操作。
而且HQL是完全面向对象的,具备继承、多态和关联等特性。
1.from子句
from字句是最简单的HQL语句,例如fromStudent,也可以写成selectsfromStudents。
它简单地返回Student类的所有实例。
除了Java类和属性的名称外,HQL语句对大小写并不敏感,所以在上一句HQL语句中,from与FROM是相同的,但是Student与student就不同了,所以上述语句写成fromstudent就会报错。
下列程序演示如何通过执行from语句取得所有的Student对象。
Queryquery=session.createQuery(“fromStudent”);
Listlist=query.list();
for(inti=0;i { Studentstu=(Student)list.get(i); System.out.println(stu.getName()); } 如果执行HQL语句“fromStudent,Course”,并不简单地返回两个对象,而是返回这两个对象的的笛卡儿积,这类似于SQL语句中字段的全外连接。 在实际应用中,像“fromStudent,Course”这样的语句几乎不会出现。 2.select子句 有时并不需要得到对象的所有属性,这时可以使用select子句进行属性查询,例如,selects.namefromStudents。 下面程序演示如何执行这个语句: Queryquery=session.createQuery(“selects.namefromStudents”); Listlist=query.list(); for(inti=0;i Stringname=(String)list.get(i); System.out.println(ame()); } 如果要查询两个以上的属性,查询结果会以数组的方式返回,如下所示: Queryquery=session.createQuery(“selects.name,s.sexfromStudentass”); Listlist=query.list(); for(inti=0;i Objectobj[]=(Object[])list.get(i); System.out.println(ame(obj[0]+“的性别是: ”+obj[1])); } 在使用属性查询时,由于使用对象数组,操作和理解都不太方便,如果将一个object[]中所有成员封装成一个对象就方便多了。 下面的程序将查询结果进行了实例化: Queryquery=session.createQuery(“selectnewStudent(s.name,s.sex)fromStudents”); Listlist=query.list(); for(inti=0;i Studentstu=(Student)list.get(i); System.out.println(stu.getName()); } 要正确运行以上程序,还需要在Student类中加入一个如下的构造函数: publicStudent(Stringname,Stringsex) { this.name=name; this.sex=sex; } 3.统计函数查询 可以在HQL中使用函数,经常使用的函数有: count(): 统计记录条数 min(): 求最小值 max(): 求最大值 sum(): 求和 age(): 求平均值 例如,要取得Student实例的数量,可以编写如下HQL语句: selectcount(*)fromStudent 取得Student的平均年龄的HQL语句如下: selectavg(s.age)fromStudentass 可以使用distinct去除重复数据: selectdistincts.agefromStudentass 4.where子句 HQL也支持子查询,它通过where子句实现这一机制。 where子句让用户缩小要返回的实例的列表范围,例如下面语句会返回所有名字为“Bill”的Student实例: Queryquery=session.createQuery("fromStudentasswheres.name='Bill'"); where子句允许出现的表达式包括了SQL中可以使用的大多数情况: 数学操作: +,-,*,/ 真假比较操作: =,>=,<=,<>,! =,like 逻辑操作: and,or,not 字符串连接: || SQL标量函数: 例如upper()和lower() 如果子查询返回多条记录,可以用以下的关键字来量化: all: 表示所有的记录。 any: 表示所有记录中的任意一条。 some: 与any用法相同。 in: 与any等价。 exists: 表示子查询至少要返回一条记录。 例如,下面语句返回所有学生的年龄都大于22的班级对象: fromGroupgwhere22 下述语句返回在所有学生中有一个学生的年龄等于22的班级: fromGroupgwhere22=any(selects.agefromg.studentss) 或者 fromGroupgwhere22=some(selects.agefromg.studentss) 或者 fromGroupgwhere22in(selects.agefromg.studentss) 5.orderby子句 查询返回的列表可以按照任何返回的类或者组件的属性排序: fromStudentsorderbys.nameasc asc和desc是可选的,分别代表升序或者降序。 6.连接查询 与SQL查询一样,HQL也支持连接查询,如内连接、外连接和交叉连接。 innerjoin: 内连接 leftouterjoin: 左外连接 rightouterjoin: 右外连接 fulljoin: 全连接,但不常用 下面重点讲解内连接查询,左外连接和右外连接查询和内连接大同小异,而全连接几乎不怎么使用。 innerjoin可以简写为join,例如在查询得到Group对象时,内连接取得对应的Student对象,实现的程序如下。 ……//打开Session,开启事务 Studentstu=null;//声明Student实例 Groupgroup=null;//声明Group实例 Queryquery=session.createQuery("fromGroupgjoing.students"); Listlist=query.list(); Objectobj[]=null;//声明对象数组 for(inti=0;i obj=(Object[])list.get(i);//取得集合中的第i个数组 group=(Group)obj[0];//group是数组中第一个对象 stu=(Student)obj[1]; //stu是数组中第二个对象 System.out.println(stu.getName()+"属于: "+group.getName()); } ……//提交事务,关闭Session hibernateSQLQueryaddEntity 2010-07-0809: 52 两个表(实体),1对多双向关联: 班级: Clazz(id,name) 学生: Student(id,name,class_id) 1.查询持久化对象 1.1简单查询,返回数据库结构 viewplaincopytoclipboardprint? sql="selectc.*fromclazzc,studentswheres.class_id=c.id"; List sql="selectc.*fromclazzc,studentswheres.class_id=c.id"; List 特别注意: 返回结果是Object[]组成的List,通过Object下标访问属性 使用场合: 非基于对象的查询,复杂查询 1.2简单查询,返回持久化对象 sql="selectc.*fromClazzc,studentswheres.class_id=c.id"; List 特别注意: 1.addEntity方法指定返回包含Clazz对象的List2.查询出来的持久态对象,clazz对象的studets属性是各代理对象,访问的时候才会去查询DB使用场合: 基于对象的查询,但对象简单查询 1.3多表查询,返回多个实体 viewplaincopytoclipboardprint? Stringsql="select{c.*},{s.*}fromClazzc,studentswheres.class_id=c.id "; List .addEntity("c",Clazz.class) .addEntity("s",Student.class).list(); Stringsql="select{c.*},{s.*}fromClazzc,studentswheres.class_id=c.id "; List .addEntity("c",Clazz.class) .addEntity("s",Student.class).list(); viewplaincopytoclipboardprint? 特别注意: 1.addEntity方法指定了当前返回实体的别名,而且在SQL语句里使用{c.*}这样的语句, 它的意思是向别名为c的这个对象注入所有属性值. 特别注意: 1.addEntity方法指定了当前返回实体的别名,而且在SQL语句里使用{c.*}这样的语句, 它的意思是向别名为c的这个对象注入所有属性值. viewplaincopytoclipboardprint? 2.这个查询会返回一个Object的List,每个Object包含两个对象一个Clazz,一个Student viewplaincopytoclipboardprint? 3.{}占位符里是对象的属性,而非列名,如{s.class},而非{s.class_id} viewplaincopytoclipboardprint? 4.必须注入对象的每个属性值,你可以使用{c.*},或者手工写全所有,但必须是所有属性。 (这个太让我郁闷了。 viewplaincopytoclipboardprint? 使用场合: 基于对象的查询,复杂查询 1.4多表查询,返回关联实体 viewplaincopytoclipboardprint? Stringsql="select{c.*},{s.*}fromClazzc,studentswheres.class_id=c.id "; List .addEntity("c",Clazz.class) .addJoin("s","c.students").list(); Stringsql="select{c.*},{s.*}fromClazzc,studentswheres.class_id=c.id "; List .addEntity("c",Clazz.class) .addJoin("s","c.students").list(); viewplaincopytoclipboardprint? 特别注意: 这块有些问题,明明应该返回Clazz的List的,但确返回包含Clazz和Student的Object的List,faint 使用场合: 基于对象的查询,复杂查询 2.查询托管对象 viewplaincopytoclipboardprint? Stringsql="selectc.id,c.namefromClazzc,studentswheres.class_id=c.id "; List .addScalar("id",Hibernate.LONG) .addScalar("name",Hibernate.STRING) .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list(); Stringsql="selectc.id,c.namefromClazzc,studentswheres.class_id=c.id "; List .addScalar("id",Hibernate.LONG) .addScalar("name",Hibernate.STRING) .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list(); 特别注意: 1.如果不设置addScalar方法可能会报转型错误的异常. 2.托管查询可以使用投影,只查询指定的列属性 查询讲解二: 1Hibernate配置文件2 2关系对象映射文件4 2.1关系对象映射文件详解5 2.1.1 2.1.2 2.1.3 2.1.3.1Generator8 2.1.4 3一对一关联映射(one-to-one节点映射)10 4一对多关联映射(one-to-many节点映射)12 5多对一关联映射(many-to-one节点映射)14 6组件(component)映射15 7子类映射(subclass)16 8 连接的子类映射(joined-subclass)17 9Hibernate查询语言(QueryLanguage),即HQL18 9.1from子句18 9.2联合(Associations)和连接(joins)19 9.3select子句20 9.4统计函数(Aggregatefunctions)21 9.5多态(polymorphism)查询22 9.6where子句22 9.7表达式(Expressions)24 9.8orderby子句28 9.9groupby子句28 9.10子查询29 9.11HQL示例29 9.12提示和技巧(Tips&Tricks)32 10条件查询(CriteriaQuery)34 10.1创建一个Criteria实例34 10.2缩小结果集范围34 10.3对结果排序35 10.4关联(Associations)35 10.5动态关联对象获取(Dynamicassociationfetching)36 10.6根据示例查询(Examplequeries)37 11 操作持久化数据(ManipulatingPersistentData)38 11.1SessionFactory38 11.2Session38 11.3. 装载对象39 11.3.1Load()装载39 11.3.2get()装载39 11.3.3find()方法装载40 11.4. 更新对象42 11.4.1在同一Session中更新42 11.4.2. 更新从session脱离的对象43 11.4.3 把与Session脱离的对象重新绑定45 11.5. 删除持久化对象45 11.6. 同步(Flush)45 11.7 提交数据库事务46 11.8. 关闭Session47 11.9. 处理异常47 1Hibernate配置文件 文件名: hibernate.cfg.xml xmlversion="1.0"encoding="utf-8"? > DOCTYPEhibernate-configuration PUBLIC"-//Hibernate/HibernateConfigurationDTD//EN" " dtd"> —-SessionFactory配置--> —-数据库URL--> jdbc: jtds: sqlserver: //localhost: 1433/DepartDEMO —-数据库JDBC驱动--> net.sourceforge.jtds.jdbc.Driver —-数据库用户名--> User —-数据库用户密码--> Password --dialect,每个数据库都有其对应的Dialet以匹配其平台特性(数据库本地语言)--> net.sf.hibernate.dialect.MySQLDialect —-是否将运行期生成的SQL输出到日志以供调试--> True —-是否使用数据库外连接--> True —-事务管理类型,这里我们使用JDBCTransaction--> net.sf.hibernate.transaction.JDBCTransactionFactory —映射文件配置,注意配置文件名必须包含其相对于根的全路径--> HibernateSQL方言(hibernate.dialect) RDBMS 方言 DB2 net.sf.hibernate.dialect.DB2Dialect DB2AS/400 net.sf.hibernate.dialect.DB2400Dialect DB2OS390 net.sf.hibernate.dialect.DB2390Dialect PostgreSQL net.sf.hibernate.dialect.PostgreSQLDialect MySQL net.sf.hibernate.dialect.MySQLDialect Oracle(anyversion) net.sf.hibernate.dia
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate 查询 集合