diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index d4571b8463..1064017222 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -12,12 +12,14 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.stream.Stream; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; import javax.persistence.criteria.Root; +import com.google.common.collect.AbstractIterator; import org.apache.commons.collections.CollectionUtils; import org.hibernate.Session; @@ -269,8 +271,19 @@ public abstract class AbstractHibernateDAO implements GenericDAO { */ public Iterator iterate(Query query) { @SuppressWarnings("unchecked") - Iterator result = (Iterator) query.getResultList().iterator(); - return result; + org.hibernate.query.Query hquery = query.unwrap(org.hibernate.query.Query.class); + Stream stream = hquery.stream(); + Iterator iter = stream.iterator(); + return new AbstractIterator () { + @Override + protected T computeNext() { + return iter.hasNext() ? iter.next() : endOfData(); + } + @Override + public void finalize() { + stream.close(); + } + }; } /**