欢迎来到天天文库
浏览记录
ID:28758157
大小:49.00 KB
页数:10页
时间:2018-12-13
《hibernatehql--实体、属性查询,全参数绑定,引用查询》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实用标准文案是Hibernate官方推荐的查询模式,比Criteria功能更强大。1)实体查询:出现类名和属性名必须注意大小写区分;当不同路径下存在相同类名,需要写入在hql中写入包名;查询目标实体存在着继承关系,将查询目标的所有子类的库表记录一起返回。Stringhql=“fromTUser”;Queryquery=session.createQuery(hql);Listlist=query.list();2)属性查询:有时页面不需要取整个对象,而只取某个属性。Listlist=session.createQ
2、uery(“selectuser.nameuser.agefromTUseruser”).list();Iteratorit=list.iterator();while(it.hasNext()){//返回的list中,每个条目都是一个对象数组,依次包含我们所获取的数据。 Object[]results=(Object[])it.next(); System.out.println(results[0]);System.out.println(results[1]);}注:如果觉得返回数组的方式不够灵活,
3、可以在HQL中构造对象实例。Listlist=this.session.createQuery(“selectnewTUser(user.name,user.age)fromTUseruser”).list();Iteratorit=list.iterator();while(it.hasNext()){ TUseruser=(TUser)it.next(); System.out.println(user.getName());}注:通过HQL动态构造对象实例,此时查询结果中的TUser对象只是一个Ja
4、va对象,仅用于对查询结果的封装,除了在构造时赋予的属性值之外,其他属性均为未赋值状态,当我们通过session对此对象进行更新,将导致对user对象的数据库插入一条新数据,而不是更新原有对象。 我们也可以在HQL的select子句中使用统计函数(count(*),min(user.age))、SQL函数(upper(user.name))、distinct关键字。1)参数绑定在HQL语句中直接写入where语句后面的条件值,不能满足参数为变量,如果参数设置变量,存在以下缺陷:a)编码凌乱,可读性降低;b)难
5、以进行性能优化,JDBC以及数据库操作原理,每次执行SQL,数据库都将对SQL语法解析和优化,将处理结果保存在缓存中,以后参数不同语法相同的SQL命令直接以缓存结果加以执行,从而避免了SQL解析和优化的开销,如果传入具体值,根据值不同将视为两个SQL语句,无法利用缓存提高性能;c)引入额外的安全风险,wherename=’”+username+”’andpassword=’”+password+”’”;在登录网页上输入用户名:“Eric’or‘x’=’x”密码随意,根据输入拼装的HQL语句是wherename=’
6、Cartier’or‘x’=’x’andpassword=’arbitrary’,由于被添加进了or‘x’=’x,所以系统登录成功。这就是SQLInjection攻击的基本原理。Hibernate参数绑定//Session.find方法中填充参数精彩文档实用标准文案session.find(“fromTUserwherename=?”,”Erica”,Hibernate.STRING);//多参数情况Object[]args=newObject[]{“Erica”,newInteger(20)};Type[]ty
7、pes=newType[]{Hibernate.STRING,Hibernate.INTEGER};session.find(“fromTUserwherename=?andage>?”,args,types);//引用占位符Stringhql=“fromTUserwherename=:name”;Queryquery=session.createQuery(hql);query.setParameter(“name”,”Erica”);Iteratorit=query.list().iterator();whi
8、le(it.hasNext()){ TUseruser=(TUser)it.next(); System.out.println(user.getName());}注:“:name”就是引用占位符,标识一个名为“name”的查询参数,setParameter对参数进行填充。//用JavaBean封装查询参数classUserQuery{ privateStri
此文档下载收益归作者所有