package org.jboss.seam.framework; import java.util.Collection; import java.util.List; import org.hibernate.Session; import org.jboss.seam.annotations.Transactional; import org.jboss.seam.persistence.QueryParser; /** * A Query object for Hibernate. * * @author Gavin King * */ public class HibernateEntityQuery<E> extends Query<Session, E> { private List<E> resultList; private E singleResult; private Long resultCount; private Boolean cacheable; private String cacheRegion; private Integer fetchSize; @Override public void validate() { super.validate(); if ( getSession()==null ) { throw new IllegalStateException("hibernateSession is null"); } } @Transactional @Override public List<E> getResultList() { if ( isAnyParameterDirty() ) { refresh(); } initResultList(); return truncResultList(resultList); } private void initResultList() { if (resultList==null) { org.hibernate.Query query = createQuery(); resultList = query==null ? null : query.list(); } } @Override @Transactional public boolean isNextExists() { return resultList!=null && getMaxResults()!=null && resultList.size() > getMaxResults(); } @Transactional @Override public E getSingleResult() { if (isAnyParameterDirty()) { refresh(); } initSingleResult(); return singleResult; } private void initSingleResult() { if (singleResult==null) { org.hibernate.Query query = createQuery(); singleResult = (E) (query==null ? null : query.uniqueResult()); } } @Transactional @Override public Long getResultCount() { if (isAnyParameterDirty()) { refresh(); } initResultCount(); return resultCount; } private void initResultCount() { if (resultCount==null) { org.hibernate.Query query = createCountQuery(); resultCount = query==null ? null : (Long) query.uniqueResult(); } } @Override public void refresh() { super.refresh(); resultCount = null; resultList = null; singleResult = null; } public Session getSession() { return getPersistenceContext(); } public void setSession(Session session) { setPersistenceContext(session); } @Override protected String getPersistenceContextName() { return "hibernateSession"; } protected org.hibernate.Query createQuery() { parseEjbql(); evaluateAllParameters(); org.hibernate.Query query = getSession().createQuery( getRenderedEjbql() ); setParameters( query, getQueryParameterValues(), 0 ); setParameters( query, getRestrictionParameterValues(), getQueryParameterValues().size() ); if ( getFirstResult()!=null) query.setFirstResult( getFirstResult() ); if ( getMaxResults()!=null) query.setMaxResults( getMaxResults()+1 ); //add one, so we can tell if there is another page if ( getCacheable()!=null ) query.setCacheable( getCacheable() ); if ( getCacheRegion()!=null ) query.setCacheRegion( getCacheRegion() ); if ( getFetchSize()!=null ) query.setFetchSize( getFetchSize() ); return query; } protected org.hibernate.Query createCountQuery() { parseEjbql(); evaluateAllParameters(); org.hibernate.Query query = getSession().createQuery( getCountEjbql() ); setParameters( query, getQueryParameterValues(), 0 ); setParameters( query, getRestrictionParameterValues(), getQueryParameterValues().size() ); return query; } private void setParameters(org.hibernate.Query query, List<Object> parameters, int start) { for (int i=0; i<parameters.size(); i++) { Object parameterValue = parameters.get(i); if ( isRestrictionParameterSet(parameterValue) ) { if(parameterValue instanceof Collection){ query.setParameterList(QueryParser.getParameterName(start + i), (Collection) parameterValue); }else{ query.setParameter( QueryParser.getParameterName(start + i), parameterValue ); } } } } protected Boolean getCacheable() { return cacheable; } protected void setCacheable(Boolean cacheable) { this.cacheable = cacheable; } protected String getCacheRegion() { return cacheRegion; } protected void setCacheRegion(String cacheRegion) { this.cacheRegion = cacheRegion; } protected Integer getFetchSize() { return fetchSize; } protected void setFetchSize(Integer fetchSize) { this.fetchSize = fetchSize; } }