1、 如何使用hql查询出某张表的记录总数?
方法一:
public static int getCount(Query query)
if(query==null)
{
return 0;
}
ScrollableResults rs=query.scroll(ScrollMode.SCROLL_INSENSITIVE);
rs.last();
return (rs.getRowNumber()+1); //rowNumber从0开始,为空时则为-1, 因此做加1操作
方法二:
获取表中的记录也可以用count的。语句如下:Session session=this.getSession;string hql="select count(tb) from table tb";Query query=session.createQuery(hql);int count=(Integer)query.uniqueResult();
方法三: query.list().size; //query.list()会先初始化query里面的对象.对于执行效率来讲不合理
2、 今天在使用hibernate的scrollResult进行多表查询时出现了如下异常:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session。
我是在查从表的同时顺带将从表给查出来了,查看从表的配置文件发现没有设置lazy="false"(因为我知道其默认值就是false)。
但是如果不手动地将其设置为false就会报错, 后当我手动设置后OK。
3、 知道了有一个专门的分页插件(pageBar).
4、 struts2的action中如何获取request与session等?
在struts1.x中是很方便的, 而在struts2中则分为两种情况, 一种为IOC, 一种为非IOC。
————————非IOC————————————
这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。
获得request对象:
A . HttpServletRequest request = ServletActionContext.getRequest ();
B.ActionContext ct= ActionContext.getContext()
HttpServletRequest request=
(HttpServletRequest)ct.get(ServletActionContext. HTTP_REQUEST );
获得session对象:
在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session则是指HttpSession对象,具体的获得方法如下所示。
A. ActionContext actionContext = ActionContext.getContext();
Map session = actionContext.getSession();
B.Map session=(Map)ActionContext.getContext().get(ActionContext.SESSION);
得到这个SessionMap之后我们就可以对session进行读写了,如果我们想得到原始的HttpSession可以首先得到HttpServletRequest对象,然后通过request.getSession()来取得原始的HttpSession对象。一般情况下SessionMap已经可以完成所有的工作,我们不必再去碰底层的session了。
————————————IOC方式——————————
action类实现ServletRequestAware接口,并新建一个HttpServletRequest request
public class UserLoginAction extends ActionSupport implements ServletRequestAware{
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
然后可以生成的request得到对象,如request.getRemoteAddr()
action类实现SessionAware接口,并创建一个MAP对象session
public class UserLoginAction extends ActionSupport implements ServletRequestAware,SessionAware{
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
public void setSession(Map session) {
this.session=session;
}
————————————————————————————————————————
下面先看一个采用第一种方式,在action中得到session的例子
package s2.ex.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class SessionTestAction extends ActionSupport {
public String execute() {
ActionContext actionContext = ActionContext.getContext();
Map session = actionContext.getSession();
session.put("USER_NAME", "Test User");
return SUCCESS;
}
}
在这个例子中,通过ActionContext得到session,并往session里放置一个key为USER_NAME,值为Test User的内容。
下面是一个实现org.apache.struts2.interceptor.SessionAware接口来对session操作的例子
package s2.ex.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class SessionTest1Action extends ActionSupport implements SessionAware {
private Map session;
public void setSession(Map session) {
this.session = session;
}
public String execute() {
this.session.put("USER_NAME", "Test User 1");
return SUCCESS;
}
}
在这个例子中实现了接口SessionAware中的setSession方法。
在一个项目中可能会有很多action都需要用到session,如果每个action都来实现org.apache.struts2.interceptor.SessionAware这个接口,可能会显得比较麻烦,所以建议作一个抽象的BaseAction类来实现org.apache.struts2.interceptor.SessionAware接口,以后所有的action只要继承这个BaseAction就可以了。
下面是一个如何在JSP中使用session的例子。
<%@ page contentType="text/html; charset=UTF-8" %>
<%@page pageEncoding="utf-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Session Test</title>
</head>
<body>
<h1><s:property value="#session.USER_NAME"/></h1>
<h1></h1>
</body>
</html>
一般在项目中往往会往session里放置一个Object,必如说user,user里有个boolean admin和String userName,如果user里存在isAdmin的方法,在jsp中可以通过<s:if test="#session.user.admin">来判断用户有没有管理权限