




免费预览已结束,剩余2页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernate对于数据库表的操作首先,我们要对Hibernate在eclipse环境下进行布局配置。详情请看Hibernate配置。其次,我们了解几个查询的用法。一、Criteria QueryCriteria Query通过面向对象化的设计,将数据查询条件封装为一个对象,换句话讲Criteria Query可以看作是传统SQL的对象化表示。如:Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.eq(“name”,”Erica”);criteria.add(Expression.eq(“sex”,new Integer(1);1. Criteria查询表达式Criteria本身只是一个查询器,具体的查询条件需要通过Criteria.add方法添加到Criteria实例中。如前面的例子所示,Expression对象具体描述了查询条件。针对SQL语法,Expression提供了对应的查询限定机制。方 法描 述Expression.eq对应SQL”field=value”表达式如Expression.eq(“name”,”Erica”);Expression.allEq参数为一个Map对象,其中包含了多个属性-值对应关系。相当于多个Expression.eq关系的叠加。Expression.gt对应SQL”fieldvalue”表达式Expression.ge对应SQL”field=value”表达式Expression.lt对应SQL”fieldvalue”表达式Expression.le对应SQL”fieldfield”Expression.geProperty用于比较两个属性之间的值,对应SQL”field=field”Expression.ltProperty用于比较两个属性之间的值,对应SQL”fieldfield”Expression.leProperty用于比较两个属性之间的值,对应SQL”field=field”Expression.andand关系组合。如:Expression.and(Expression.eq(“name”,”Erica”),Expression.eq(“sex”,newInteger(1);Expression.oror关系组合。如:Expression.or(Expression.eq(“name”,”Erica”),Expression.eq(“name”,”Emma”);Expression.sql作为补充,本方法提供了原生SQL语法的支持。我们可以通过这个方法直接通过SQL语句限定查询条件下面的代码返回所有名称以”Erica”启始的记录:Expression.sql(“lower() like lower(?)”,”Erica%”,Hibernate.STRING);其中的”(alias)”将由Hibernate在运行期使用当前关联的POJO别名替换。注意Expression各方法中的属性名参数(如Express.eq中的第一个参数),这里所谓属性名是POJO中对应实际库表字段的属性名(大小写敏感),而非库表中的实际字段名称。几个查询示例:查询名为“Erica”的用户记录:Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.eq(“name”,”Erica”);查询所有年龄大于18岁的用户记录:Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.gt(“age”,new Integer(18);查询所有年龄大于20岁且小于30的用户记录:Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.gt(“age”,new Integer(20);criteria.add(Expression.lt(“age”,new Integer(30);2. 示例查询Example类实现了Criterion接口,同样,它也可以用作Criteria的查询条件。Example的作用是:根据已有对象,查找属性与之相符的其他对象。先看一个简单的例子:Criteria criteria = session.createCriteria(TUser.class);Tuser exampleUser = new TUser();exampleUser.setName(“Erica”);criteria.add(Example.create(exampleUser);List list = criteria.list();for(int i = 0; i list.size(); i+)TUser user = (TUser)list.get(i);System.out.println(“User”+i+”t”+user.getName();在这里我们新建了一个TUser对象exampleUser,并作为范本,查询所有name属性与之相同的用户记录。对于这个范例而言,下列代码:TUser exampleUser = new TUser();exampleUser,setName(“Erica”);criteria.add(Example.create(exampleUser);的效果等同于:criteria.add(Expression.eq(“name”,”Erica”);默认情况下,Hibernate会过滤掉示例对象的Null值属性,我们也可以通过调用Example.excludeNone/excludeZeroes方法来对这个特性进行调整,或者通过Example.excludeProperty方法将某个属性排除在外。示例查询最常用的场景是组合查询。我们常常需要在界面上提供若干查询选项,然后根据用户的选择返回符合条件的结果。大部分情况下,我们会在代码中进行判断,根据用户输入的查询生成最终的查询条件。举个简单的例子:public List queryUser(String name,Integer age)throws HibernateExceptionCriteria criteria = session,createCriteria(TUser.class);if(null != name)criteria.add(Expression.like(“name”,name);if(null != age)criteria.add(Expression.eq(“age”,age);return criteria.list();对于上面的例子,假设出现了10个可选参数,那么用Expression会很复杂。示例查询在这里恰恰能发挥其特长,对于上面这个例子而言,我们将其修改如下:public List queryUserByExample(TUser user)throws HibernateExceptionCriteria critera = session.createCriteria(TUser.class);critera.add(Example.create(user);return criteria.list();3. 复合查询在数据关联部分中,我们引入了一个例子作为一对多关联的范例:TUser对象和TAddress对象的一对多关联。通过下面的代码,我们可以打印出目前数据库内所有的用户及其地址:Criteria criteria = session.createCriteria(TUser.class);List list = criteria.list();for(int i = 0;i list.size();i+)TUser user = (TUser)list.get(i);System.out.println(“t”+user.getName();Set addrSet = user.getAddresses();Iterator it = addrSet.iterator();while(it.hasNext()TAddress addr = (TAddress) it.next();System.out.println(“tt”+addr.getAddress();输出结果如下:User0EricaShanghaiUser1CartierGuangzhou现在如果我们需要查找出所有属位于上海的用户该如何操作,通过Criteria的复合查询我们可以轻松完成这个任务。对上面代码稍加改造:Criteria criteria = session.createCriteria(TUser.class);Criteria addrCriteria = criteria.createCriteria(“addresses”);addrCriteria.add(Expression.like(“address”,”%Shanghai%”);List list;list = criteria.list();for(int i = 0;i list.size();i+)System.out.println(“User”+i+”);TUser user = (TUser)list.get(i);System.out.println(“t”+user.getName();Set addrSet = user.getAddresses();Iterator it = addrSet.iterator();while(it.hasNext()TAddress addr = (TAddress)it.next();System.out.println(“tt”+addr.getAddress();运行结果如下:User0EricaShanghai代码中下画线部分就是我们新增的复合查询条件,可以看到,我们可以通过Criteria.createCriteria 方法在原有Criteria对象的基础上构建复合查询。通过:Criteria addrCriteria = criteria.createCriteria(“addresses”);我们在原有查询的基础上,针对TUser对象的addresses属性构造了新的查询过滤条件:addrCriteria.add(Expression.like(“address”,”%Shanghai%”);Hibernate会在运行期构造以下SQL语句完成用户查询:select from T_USER user inner join T_Address address on user.id = address.user_id where address.address like ?二、Hibernate Query Language(HQL)完整的HQL语法结构如下:select/update/delete from where group by having order by三、HQL实用技术1实体查询下面我们来看最简单的一个例子:String hql = “from TUser”;Query query = session.createQuery(hql);List userList = query.list();上面的hql:”from TUser”,将取出TUser的所有对应记录,对应SQL为”select from T_User”。我们也可以在HQL中采用全路径类名,特别是在应用中存在同名类(包名不同)的情况下。如:“from com.redsaga.hibernate.db.entity.TUser”提示:HQL子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。需要注意的是,Hibernate中,查询的目标实体存在在继承关系的判定如:”from TUser”将返回所有TUser以及TUser子类的记录,假设系统中存在TUser的两个子类:TSysAdmin和TSysOperator,那么”from TUser”返回的记录将包含这两个子类的所有数据,即使TSysAdmin和TSysOperator分别对应了不同的库表。Java中所有类的根类都是java.lang.Object,那么,如下HQL将返回数据库中所有库表的记录:“from java.lang.Object”Where子句:如果我们需要取出名为”Erica”的用户的记录,类似SQL,我们可以通过HQL语句加以限定:String hql = “from TUser as user where = Erica”;Query query = session.createQuery(hql);List userList = query.list();这里我们新引入了两个子句”as”和”where”,as子句为类名创建了一个别名,而where字句指定了限定条件。其中as子句可忽略,如:“from TUser user where =Erica”where子句中,我们可以通过比较操作符指定甄选条件,如:= , , , = , 20;from TUser user where user.age between 20 and 30from TUser user where user.age in(18,28);from TUser user where is nullfrom TUser user where like Er%对于用于字符串比较的like操作符而言,”like Er%”表示所有以Er开头的字符串,”like %Er”表示所有以Er结尾的字符串,而”like %Er%”则表示包含Er字样的字符串(无论Er出现在字符串首尾或中间)。我们也可以在where子句中使用算术表达式,如:From TUser user where (user.age % 2 = 1)上面的HQL将返回所有年龄为奇数的用户记录。与SQL相同,我们可以通过and、or等逻辑连接符组合各个逻辑表达式:from TUser user where (user.age20) and ( like Ee%)2属性查询有时我们并不需要获取完整的实体对象,如在一个下拉框中显示用户名,此时我们需要的数据可能仅仅是实体对象的某个属性(库表记录中的某个字段信息)。同样,通过HQL我们也可以简单地做到这一点:List list = session.createQuery(“select from TUser user”).list();Iterator it = list.iterator();while(it.hashNext()System.out.println(it.next(); /每个条目都是一个String类型数据。HQL”select from TUser user”指定了我们只需获取TUser对象的name属性(也就是T_User表的name字段)。此时返回的list数据结构中,每个条目都是一个String类型的name数据(而非TUser对象);我们也可以通过一条HQL获取多个属性:List list = session.createQuery(“select ,user.age from TUser as user”).list();Iterator it = list.iterator();while(it.hasNext()Object results = (Object)it.next();System.out.println(results0);System.out.println(results1);“select ,user.age from TUser as user”表明我们需要读取name 和 age属性的内容。而此时,返回的list数据结构中,每个条目都是一个对象数组(Object),其中,依次包含了我们所获取的属性数据。如果觉得返回数组的方式不够符合面向对象的风格,我们也 通过在HQL中动态构造对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民族情民族魂课件
- 2025年急性中风的急救处理策略考试卷答案及解析
- 2025年口腔颌面外科术后护理要点模拟考试答案及解析
- 2025年放射治疗技术评估考试答案及解析
- 2025年药物临床药物不良反应处理答案及解析
- 2025年全科医学肺炎诊断处理流程答案及解析
- 2025年儿科医学专业技术资格考试答案及解析
- 2025年中医外科经络穴位技术操作检测试卷答案及解析
- 2025年眼科常见疾病诊断治疗技能考核测试卷答案及解析
- 中国经济新质生产力解析
- 中国马克思主义与当代(社会问题)
- 水文地质学基础课件
- 光伏并网逆变器调试报告
- 《科学思维与科学方法论》第二章 科学思维的逻辑方法
- EMR术的配合要点
- 1844年经济学哲学手稿课件
- 痰培养的采集及药敏结果判读课件
- 家庭医生签约服务业务培训课件
- 1-商务沟通基本原理
- 让物料流动起来MMF,PFEP
- 高血压护理查房ppt
评论
0/150
提交评论