package edu.sjtu.infosec.ismp.manager.BSAM.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import edu.sjtu.infosec.ismp.manager.BSAM.comm.BaseDaoHibernate;
import edu.sjtu.infosec.ismp.manager.BSAM.dao.MachineDao;
import edu.sjtu.infosec.ismp.manager.BSAM.model.Machine;
import edu.sjtu.infosec.ismp.security.Domain;
public class MachineDaoImpl extends BaseDaoHibernate implements MachineDao {
@SuppressWarnings("unchecked")
public List getMachineList() {
StringBuffer hql = new StringBuffer("from Machine");
return getHibernateTemplate().find(hql.toString());
}
@SuppressWarnings("unchecked")
public List getMachineList(int startResult, int maxResult) {
String hql = "from Machine order by id ";
Session session = this.getSession();
Query query = session.createQuery(hql);
query.setFirstResult(startResult);
query.setMaxResults(maxResult);
return query.list();
}
@SuppressWarnings("unchecked")
public List getMachineListByDomain(List<Domain> userDomainList,int startResult, int maxResult) {
if(null == userDomainList || userDomainList.size() <= 0){
return null;
}
StringBuffer userDomainStr = new StringBuffer();
///遍历userDomainList,将domain的id组成一个字符串
for (int i = 0; i < userDomainList.size(); i++) {
if(i != (userDomainList.size()-1)){
userDomainStr.append(userDomainList.get(i).getId()).append(",");
}else{
userDomainStr.append(userDomainList.get(i).getId());
}
}
/**原生SQL
select x.id,x.description,x.ip,x.machine_name,x.parent_type,
x.weight,x.machine_cabinet_id,x.machine_room_id,x.security_area_id from (
select m.* from bsam_machine m
left join ismp_domain d on d.id = m.security_area_id where 1=1 and d.id in (1,2,3)
union
select m.* from bsam_machine m
left join bsam_machine_cabinet mc on mc.id = m.machine_cabinet_id
left join bsam_machine_room mr on mr.id = mc.machine_room_id
left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (1,2,3)
union
select m.* from bsam_machine m
left join bsam_machine_room mr on mr.id = m.machine_room_id
left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (1,2,3)
) x order by x.id
**/
StringBuffer sql = new StringBuffer(" select x.id,x.description,x.ip,x.machine_name,x.parent_type, \n");
sql.append(" x.weight,x.machine_cabinet_id,x.machine_room_id,x.security_area_id from ( \n");
sql.append(" select m.* from bsam_machine m \n ");
sql.append(" left join ismp_domain d on d.id = m.security_area_id where 1=1 and d.id in (");
sql.append(userDomainStr);
sql.append(") \n");
sql.append(" union \n");
sql.append(" select m.* from bsam_machine m \n");
sql.append(" left join bsam_machine_cabinet mc on mc.id = m.machine_cabinet_id \n");
sql.append(" left join bsam_machine_room mr on mr.id = mc.machine_room_id \n");
sql.append(" left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (");
sql.append(userDomainStr);
sql.append(") \n");
sql.append(" union \n");
sql.append(" select m.* from bsam_machine m \n");
sql.append(" left join bsam_machine_room mr on mr.id = m.machine_room_id \n");
sql.append(" left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (");
sql.append(userDomainStr);
sql.append(") \n");
sql.append(" ) x order by x.id \n");
Query query = this.getSession().createSQLQuery(sql.toString());///这里用原生SQL.
// query.setString("userDomainStr", userDomainStr.toString());///cc?:不知道为什么在HQL中这种方式不可以,赋值错误
query.setFirstResult(startResult);
query.setMaxResults(maxResult);
return query.list();
}
public void saveOrUpdate(Machine machine) {
getHibernateTemplate().saveOrUpdate(machine);
}
@SuppressWarnings("unchecked")
public int getCount() {
int num = 0;
List list=getHibernateTemplate().find("from Machine");
if (null != list && list.size() > 0) {
num = list.size();
}
return num;
}
public int getCountByDomain(List<Domain> userDomainList) {
if(null == userDomainList || userDomainList.size() <= 0){
return 0;
}
StringBuffer userDomainStr = new StringBuffer();
///遍历userDomainList,将domain的id组成一个字符串
for (int i = 0; i < userDomainList.size(); i++) {
if(i != (userDomainList.size()-1)){
userDomainStr.append(userDomainList.get(i).getId()).append(",");
}else{
userDomainStr.append(userDomainList.get(i).getId());
}
}
/**原生SQL
select x.id,x.description,x.ip,x.machine_name,x.parent_type,
x.weight,x.security_area_id,x.machine_cabinet_id,x.machine_room_id from (
select m.* from bsam_machine m
left join ismp_domain d on d.id = m.security_area_id where 1=1 and d.id in (1,2,3)
union
select m.* from bsam_machine m
left join bsam_machine_cabinet mc on mc.id = m.machine_cabinet_id
left join bsam_machine_room mr on mr.id = mc.machine_room_id
left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (1,2,3)
union
select m.* from bsam_machine m
left join bsam_machine_room mr on mr.id = m.machine_room_id
left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (1,2,3)
) x order by x.id
**/
StringBuffer sql = new StringBuffer(" select x.id,x.description,x.ip,x.machine_name,x.parent_type, \n");
sql.append(" x.weight,x.security_area_id,x.machine_cabinet_id,x.machine_room_id from ( \n");
sql.append(" select m.* from bsam_machine m \n ");
sql.append(" left join ismp_domain d on d.id = m.security_area_id where 1=1 and d.id in (");
sql.append(userDomainStr);
sql.append(") \n");
sql.append(" union \n");
sql.append(" select m.* from bsam_machine m \n");
sql.append(" left join bsam_machine_cabinet mc on mc.id = m.machine_cabinet_id \n");
sql.append(" left join bsam_machine_room mr on mr.id = mc.machine_room_id \n");
sql.append(" left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (");
sql.append(userDomainStr);
sql.append(") \n");
sql.append(" union \n");
sql.append(" select m.* from bsam_machine m \n");
sql.append(" left join bsam_machine_room mr on mr.id = m.machine_room_id \n");
sql.append(" left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (");
sql.append(userDomainStr);
sql.append(") \n");
sql.append(" ) x order by x.id \n");
Query query = this.getSession().createSQLQuery(sql.toString());///因为HQL多表关联需要设置表关系,所以这里用原生SQL.
int num = 0;
if (null != query.list()&& query.list().size() > 0) {
num = query.list().size();
}
return num;
}
@SuppressWarnings("unchecked")
public List getTopMachineListByWeight(int maxResult) {
String hql = "from Machine order by weight desc";
Session session = this.getSession();
Query query = session.createQuery(hql);
query.setMaxResults(maxResult);
return query.list();
}
@SuppressWarnings("unchecked")
public List getTopMachineListByWeightByDomain(List<Domain> userDomainList,int maxResult) {
if(null == userDomainList || userDomainList.size() <= 0){
return null;
}
StringBuffer userDomainStr = new StringBuffer();
///遍历userDomainList,将domain的id组成一个字符串
for (int i = 0; i < userDomainList.size(); i++) {
if(i != (userDomainList.size()-1)){
userDomainStr.append(userDomainList.get(i).getId()).append(",");
}else{
userDomainStr.append(userDomainList.get(i).getId());
}
}
StringBuffer sql = new StringBuffer(" select x.id,x.description,x.ip,x.machine_name,x.parent_type, \n");
sql.append(" x.weight,x.machine_cabinet_id,x.machine_room_id,x.security_area_id from ( \n");
sql.append(" select m.* from bsam_machine m \n ");
sql.append(" left join ismp_domain d on d.id = m.security_area_id where 1=1 and d.id in (");
sql.append(userDomainStr);
sql.append(") \n");
sql.append(" union \n");
sql.append(" select m.* from bsam_machine m \n");
sql.append(" left join bsam_machine_cabinet mc on mc.id = m.machine_cabinet_id \n");
sql.append(" left join bsam_machine_room mr on mr.id = mc.machine_room_id \n");
sql.append(" left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (");
sql.append(userDomainStr);
sql.append(") \n");
sql.append(" union \n");
sql.append(" select m.* from bsam_machine m \n");
sql.append(" left join bsam_machine_room mr on mr.id = m.machine_room_id \n");
sql.append(" left join ismp_domain d on d.id = mr.security_area_id where 1=1 and d.id in (");
sql.append(userDomainStr);
sql.append(") \n");
sql.append(" ) x order by x.weight desc \n");
Query query = this.getSession().createSQLQuery(sql.toString());
query.setMaxResults(maxResult);
return query.list();
}
}