package com.jspxcms.core.generatepage; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.persistence.EntityManager; import org.hibernate.CacheMode; import org.hibernate.Query; import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.springframework.stereotype.Repository; import com.jspxcms.common.web.PathResolver; import com.jspxcms.core.domain.Info; import com.jspxcms.core.domain.Node; import freemarker.template.Configuration; import freemarker.template.TemplateException; /** * GeneratePageDaoImpl * * @author liufang * */ @Repository public class GeneratePageDaoImpl implements GeneratePageDao { public int generateNodeWhole(String[] treeNumber, Configuration config, PathResolver resolver) throws IOException, TemplateException { Session session = em.unwrap(Session.class); // Session session = (Session) em.getDelegate(); Map<String, Object> params = new HashMap<String, Object>(); StringBuilder hql = new StringBuilder("from Node bean where (1=2"); for (int i = 0, len = treeNumber.length; i < len; i++) { hql.append(" or bean.treeNumber like :treeNumber").append(i); params.put("treeNumber" + i, treeNumber[i] + "%"); } hql.append(")"); Query query = session.createQuery(hql.toString()); query.setProperties(params); query.setCacheMode(CacheMode.IGNORE); ScrollableResults nodes = query.scroll(ScrollMode.FORWARD_ONLY); Node node; int count = 0; while (nodes.next()) { node = (Node) nodes.get(0); PNode.generate(node, config, resolver); // 一个节点可能有很多翻页,这里稍微设置小一点 if (++count % 5 == 0) { session.clear(); } } return count; } public int generateInfoWhole(String[] treeNumber, Configuration config, PathResolver resolver) throws IOException, TemplateException { Session session = (Session) em.getDelegate(); Map<String, Object> params = new HashMap<String, Object>(); StringBuilder hql = new StringBuilder( "from Info bean where bean.status='A' and (1=2"); for (int i = 0, len = treeNumber.length; i < len; i++) { hql.append(" or bean.node.treeNumber like :treeNumber").append(i); params.put("treeNumber" + i, treeNumber[i] + "%"); } hql.append(")"); Query query = session.createQuery(hql.toString()); query.setProperties(params); query.setCacheMode(CacheMode.IGNORE); ScrollableResults infos = query.scroll(ScrollMode.FORWARD_ONLY); Info info; int count = 0; while (infos.next()) { info = (Info) infos.get(0); PInfo.generate(info, config, resolver); if (++count % 20 == 0) { session.clear(); } } return count; } private EntityManager em; @javax.persistence.PersistenceContext public void setEm(EntityManager em) { this.em = em; } }