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

CoryNuly 2016-10-13 02:45:15
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查询语句是什么意思?最好能把整个代码讲一下,越详细越好!
...全文
250 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32100781 2016-10-20
  • 打赏
  • 举报
回复
以下是参考我的理解分析 分开来看: 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个参数控制得到的查询结果,实现精确的分页查询 额,啰嗦了。。。。先到这吧
CoryNuly 2016-10-13
  • 打赏
  • 举报
回复
引用 5 楼 u014181631 的回复:
[quote=引用 3 楼 qq_28752625 的回复:] roleList=(List<Role>) super.showPage(sb.toString(), buffer.toString(), role.getPage(), role.getPagesize()); 主要是这句话,是什么意思啊?有什么作用?
有什么用 你点showPage方法进去看啊,都没贴showPage方法的代码出来,我们怎么知道[/quote] public List<?> showPage(String queryHql, String queryCountHql, int firstResult, int maxResult) throws Exception { List<Object> list = new ArrayList<Object>(); try { Session session = this.getSession(); list.add(session.createQuery(queryHql).setFirstResult(firstResult) .setMaxResults(maxResult).list()); list.add(session.createQuery(queryCountHql).setMaxResults(1) .uniqueResult()); } catch (Exception e) { throw new RuntimeException(e); } return list; } 这个代码,调用session进行查询,把值放到list中吧!我一个新手说的没错吧
小灯光环 2016-10-13
  • 打赏
  • 举报
回复
引用 4 楼 qq_28752625的回复:
[quote=引用 1 楼 wlwlwlwl015 的回复:] 很简单, 两个StringBuffer对象代表两条hql语句sb.append就是根据参数动态拼接hql sb.append是查询数据的 buffer.append是查询count(*),即数量的 这应该是权限的一个分页查询列表
roleList=(List<Role>) super.showPage(sb.toString(), buffer.toString(), role.getPage(), role.getPagesize()); 主要是这句话是什么意思啊?有什么作用?[/quote] 肯定是查询分页列表数据,方法把sql语句都传进去了,你有代码可以点进去看一下,showPage这个方法,肯定是封装好的分页查询~ hibernate分页很方便。。直接setmax settotal就行了
___d 2016-10-13
  • 打赏
  • 举报
回复
引用 4 楼 qq_28752625 的回复:
[quote=引用 1 楼 wlwlwlwl015 的回复:] 很简单, 两个StringBuffer对象代表两条hql语句sb.append就是根据参数动态拼接hql sb.append是查询数据的 buffer.append是查询count(*),即数量的 这应该是权限的一个分页查询列表
roleList=(List<Role>) super.showPage(sb.toString(), buffer.toString(), role.getPage(), role.getPagesize()); 主要是这句话是什么意思啊?有什么作用?[/quote] 大概就是一个角色列表
___d 2016-10-13
  • 打赏
  • 举报
回复
引用 3 楼 qq_28752625 的回复:
roleList=(List<Role>) super.showPage(sb.toString(), buffer.toString(), role.getPage(), role.getPagesize()); 主要是这句话,是什么意思啊?有什么作用?
有什么用 你点showPage方法进去看啊,都没贴showPage方法的代码出来,我们怎么知道
CoryNuly 2016-10-13
  • 打赏
  • 举报
回复
引用 1 楼 wlwlwlwl015 的回复:
很简单, 两个StringBuffer对象代表两条hql语句sb.append就是根据参数动态拼接hql sb.append是查询数据的 buffer.append是查询count(*),即数量的 这应该是权限的一个分页查询列表
roleList=(List<Role>) super.showPage(sb.toString(), buffer.toString(), role.getPage(), role.getPagesize()); 主要是这句话是什么意思啊?有什么作用?
CoryNuly 2016-10-13
  • 打赏
  • 举报
回复
roleList=(List<Role>) super.showPage(sb.toString(), buffer.toString(), role.getPage(), role.getPagesize()); 主要是这句话,是什么意思啊?有什么作用?
  • 打赏
  • 举报
回复
super.showPage想看这两个sql具体是怎么用的去这个函数里去找
小灯光环 2016-10-13
  • 打赏
  • 举报
回复
很简单,
两个StringBuffer对象代表两条hql语句sb.append就是根据参数动态拼接hql
sb.append是查询数据的
buffer.append是查询count(*),即数量的
这应该是权限的一个分页查询列表

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧