请教!使用hibernate操作数据,看不太懂impl中的语句

J2EE 码拜 3年前 (2017-04-12) 611次浏览
public List<Role> getRoleForList(Role role) {
List<Role> roleList=new ArrayList<Role>();
StringBuffer sb=new StringBuffer();
StringBuffer buffer=new StringBuffer();
try {
sb.append(“from Role r Where 1=1 “);
buffer.append(“select count(*) from Role r Where 1=1 “);
if(null!=role.getName()){
sb.append(“and r.name like “%”+role.getName()+”%” “);
buffer.append(“and r.name like “%”+role.getName()+”%” “);
}
roleList=(List<Role>) super.showPage(sb.toString(), buffer.toString(), role.getPage(), role.getPagesize());
} catch (Exception e) {
e.printStackTrace();
return null;
}
return roleList;
}
请教这段代码中sb.sppend和buffer是什么关系,有什么区别?那两句sql查询语句是什么意思?最好能把整个代码讲一下,越详细越好!
解决方案

10

很简单,
两个StringBuffer对象代表两条hql语句sb.append就是根据参数动态拼接hql
sb.append是查询数据的
buffer.append是查询count(*),即数量的
这应该是权限的一个分页查询列表

15

以下是参考本人的理解分析
分开来看:
sb.append(“from Role r Where 1=1 “);
if(null!=role.getName()){
sb.append(“and r.name like “%”+role.getName()+”%” “);
用StringBuffer来动态拼接hql,”追加“拼接前后都是同一个StringBuffer对象,StringBuffer是线程安全的,效率也高。‘
添加了if(){},更加灵活,仅在role.getName()!=nul
l(存在此角色,作权限验证时关联到)时,
拼接sql(“and r.name like “%”+role.getName()+”%” “。可以实现:
1.查询全部的角色集合
2.like模糊查询。

–.假如使用String ,按照一般的做法:
这时候要实现
1.查询全部的角色集合
2.like模糊查询
需要2条语句
String hql=“from Role“
String Hql=“from Role r Where  r.name like “%”+role.getName()+”%” “,
分别写在不同的2个方法中,
考虑到线程安全,所以不会在同一个方法内使用
String hql=“from Role“,String hql1= ”r Where  r.name like “%”+role.getName()+”%” ”
String Hql=hql+hql1;的方式拼接字符串.
StringBuffer buffer的作用也相似于StringBuffer sb,都是线程安全下的动态sql拼接

roleList=(List<Role>) super.showPage(sb.toString(), buffer.toString(), role.getPage(), role.getPagesize());
sb.toString(),sb是一个字符串序列,类型是StringBuffer
showPage()的参数类型是(String,String,。),
调用toString转换为String,
原因是createQuery()的传入参数类型是String

setFirstResult(0);//从第1条记录开始,索引从0开始,
setMaxResults(4);//取出4条记录–》表示所取的记录数,索引从1开始
list()//返回一个集合
uniqueResult()//当明确知道查询的结果只有1条时,使用该方法而不使用list(),效率更高,该方法返回1个对象,而不是集合,若查询到多条记录,则抛出异常
–setFirstResult(firstResult),
表示从第(firstResult+1)记录开始取
.setMaxResults(maxResult)
表示取出maxResult条记录
.list()
.uniqueResult()//返回1条记录
由于实现类的实现查询功能的语句太长了,连缀调用,假如刚入门,可能不会太理解。
可以把它们拆开看:
session.createQuery(queryHql).setFirstResult(firstResult)
.setMaxResults(maxResult).list()相当于
以下代码:
Query query=session.createQuery(queryHql);
//对查询结果进行筛选
query.setFirstResult(firstResult);
query.setMaxResults(maxResult);
//返回集合
List<Object> =query.list();

session.createQuery(queryCountHql).setMaxResults(1)
.uniqueResult()相当于
以下代码:
Query query=session.createQuery(queryHql);
//对查询结果进行筛选
query.setMaxResults(1);
//返回1个Object 对象
Object  obj=query.uniqueResult();

从调用传入的实参看:
super.showPage(sb.toString(), buffer.toString(), role.getPage(), role.getPagesize()
传入的sql字符串(sb.toString()等)为:
假如role.getName()为空,字符串为”from Role r Where 1=1“,查询全部角色,返回角色的集合
假如role.getName()不为空,字符串为”from Role r Where 1=1 and r.name like “%”+role.getName()+”%” “,模糊查询,返回包含指定名字的角色集合。
传入role.getPage(), role.getPagesize(),–可能是是页面显示的总页数(共多少页)和每页显示的记录数(每页显示多少条)
同时调用setFirstResult(),setMaxResults(),
实现更精确地查询。
总的来说就是
接收页面传来的要显示的总页数,和每页显示的记录条数,再根据这2个参数控制得到的查询结果,实现精确的分页查询
额,啰嗦了。先到这吧请教!使用hibernate操作数据,看不太懂impl中的语句

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明请教!使用hibernate操作数据,看不太懂impl中的语句
喜欢 (0)
[1034331897@qq.com]
分享 (0)