package edu.sjtu.infosec.ismp.manager.RAM.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.sjtu.infosec.ismp.manager.RAM.dao.PapeDao;
import edu.sjtu.infosec.ismp.manager.RAM.model.AsseInfoPape;
import edu.sjtu.infosec.ismp.manager.RAM.model.AsseInfoProj;
import edu.sjtu.infosec.ismp.manager.comm.model.page.Page;
/**
* 数据层 问卷Dao实现类.
*
**/
public class PapeDaoImpl extends HibernateDaoSupport implements PapeDao {
/**
* 查询问卷问题
*
* @param id
* 问卷问题id
* @return 问卷问题对象
**/
public AsseInfoPape find(Integer id) {
AsseInfoPape asseInfoPape = new AsseInfoPape();
asseInfoPape = (AsseInfoPape) getHibernateTemplate().load(AsseInfoPape.class, id);
return asseInfoPape;
}
public AsseInfoPape findbySecuId(Integer projId,Integer id) {
AsseInfoPape asseInfoPape=new AsseInfoPape();
Query query = this.getSession().createQuery("from AsseInfoPape pape where pape.secuElem.id=:id and pape.asseInfoProjId=:projId");
query.setInteger("id", id);
query.setInteger("projId", projId);
List list = query.list();
if(list!=null && list.size()>0){
asseInfoPape = (AsseInfoPape) list.get(0);
}
return asseInfoPape;
}
/**
* 查询问卷问题数量
* @param asseInfoProj
* 测评项目
* @return 问卷问题数量
**/
public int getCount(AsseInfoProj asseInfoProj) {
Criteria criteria = getSession().createCriteria(AsseInfoPape.class);
return 0;//count(criteria);
}
/**
* 查询问卷问题分页记录
* @param page
* 分页对象
* @param asseInfoProj
* 测评项目
* @return 分页记录列表
**/
public List<AsseInfoPape> listAsseInfoPape(Page page,
AsseInfoProj asseInfoProj) {
Criteria criteria = getSession().createCriteria(AsseInfoPape.class)
.addOrder(Order.asc("secuElem"));
if(page!=null) {
criteria.setFirstResult(page.getBeginIndex())
.setMaxResults(page.getEveryPage());
}
if(asseInfoProj!=null) {
criteria.add(Expression.eq("asseInfoProjId", asseInfoProj.getId()));
}
return criteria.list();
}
/**
* 删除问卷问题
*
* @param question
* 问卷问题
**/
public void remove(AsseInfoPape question) {
getHibernateTemplate().delete(question);
}
/**
* 批量删除问卷问题
*
* @param questionList
* 问卷问题对象列表
**/
public void remove(List<AsseInfoPape> questionList) {
getHibernateTemplate().deleteAll(questionList);
}
/**
* 保存/更新问卷问题
*
* @param question
* 问卷问题
**/
public void saveOrUpdate(AsseInfoPape question) {
getHibernateTemplate().saveOrUpdate(question);
}
/**
* 批量保存/更新问卷问题
*
* @param question
* 问卷问题
**/
@SuppressWarnings("unchecked")
public void batchSaveOrUpdate(final List questions) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException,SQLException {
for(int i=0;i<questions.size();i++) {
AsseInfoPape question = (AsseInfoPape) questions.get(i);
session.merge(question);
System.out.println("batch saved question:"+question.toString());
if((i+1)%20==0){
session.flush();
session.clear();
}
}
return null;
}
});
}
/**
* 查询下一题问题列表
* @param asseInfoPape
* 当前问题
* @return 下一题问题列表
**/
public List<AsseInfoPape> listNextPapes(AsseInfoPape asseInfoPape){
Criteria criteria = getSession().createCriteria(AsseInfoPape.class);
if(asseInfoPape!=null) {
criteria.add(Expression.eq("asseInfoProjId", asseInfoPape.getAsseInfoProjId()));
criteria.addOrder(Order.asc("secuElem"));
criteria.add(Expression.gt("secuElem", asseInfoPape.getSecuElem()));
criteria.setMaxResults(1);
}
return criteria.list();
}
/**
* 查询下一题问题
* @param asseInfoPape
* 有跳转点的当前问题
* @return 下一题问题
**/
public AsseInfoPape getNextJumpAsseInfoPape(AsseInfoPape asseInfoPape) {
AsseInfoPape question = null;
Criteria criteria = getSession().createCriteria(AsseInfoPape.class);
if(asseInfoPape!=null) {
criteria.add(Expression.eq("asseInfoProjId", asseInfoPape.getAsseInfoProjId()));
criteria.addOrder(Order.asc("secuElem"));
criteria.add(Expression.eq("secuElem", asseInfoPape.getSecuElem().getJumpSecuElem()));
}
List list = criteria.list();
if(list!=null && list.size()>0) {
question = (AsseInfoPape) list.get(0);
}
return question;
}
/**
* 查询已答问题列表
* @param asseInfoProjId
* 项目编号
* @return 已答问题列表
**/
public List<AsseInfoPape> listAnsweredPapes(Integer asseInfoProjId) {
Criteria criteria = getSession().createCriteria(AsseInfoPape.class)
.add(Expression.eq("asseInfoProjId", asseInfoProjId))
.add(Expression.isNotNull("answer"))
.addOrder(Order.asc("secuElem"));
return criteria.list();
}
/**
* 根据答案查询已答问题列表
* @param asseInfoProjId
* 项目编号
* @param answer
* 答案
* @return 已答问题列表
**/
public List<AsseInfoPape> listPapesByAnswer(Integer asseInfoProjId, String answer) {
Criteria criteria = getSession().createCriteria(AsseInfoPape.class)
.add(Expression.eq("asseInfoProjId", asseInfoProjId))
.add(Expression.eq("answer",answer))
.addOrder(Order.asc("secuElem"));
return criteria.list();
}
}