From 2ea19fdd58b0d8751815d2639e115a3f5d25dbaa Mon Sep 17 00:00:00 2001
From: juanf <juanf>
Date: Wed, 8 Mar 2017 15:05:54 +0000
Subject: [PATCH] SSDM-4682 : bugix, openBIS empty trashcan breaks when num
 entities over 2-byte due to SQL IN

SVN: 37868
---
 .../server/dataaccess/db/InQueryScroller.java |  6 ++--
 .../server/dataaccess/db/MetaprojectDAO.java  | 29 ++++++++++++-------
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQueryScroller.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQueryScroller.java
index 49cbd0204c7..6964f08b259 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQueryScroller.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQueryScroller.java
@@ -1,5 +1,7 @@
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 public class InQueryScroller<I>
@@ -12,9 +14,9 @@ public class InQueryScroller<I>
 
     private int fixParamsSize;
 
-    public InQueryScroller(List<I> inArguments, int fixParamsSize)
+    public InQueryScroller(Collection<I> inArguments, int fixParamsSize)
     {
-        this.inArguments = inArguments;
+        this.inArguments = new ArrayList<>(inArguments);
         this.fromIndex = 0;
         this.fixParamsSize = fixParamsSize;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAO.java
index 7b7bf1ddc68..5e387b27d45 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAO.java
@@ -186,18 +186,27 @@ public class MetaprojectDAO extends AbstractGenericEntityDAO<MetaprojectPE> impl
         {
             return Collections.emptySet();
         }
-        final DetachedCriteria criteria = DetachedCriteria.forClass(MetaprojectAssignmentPE.class);
-        criteria.createAlias("metaproject", "m");
-        criteria.add(Restrictions.eq("m.owner", owner));
-        criteria.add(Restrictions.in(entityKind.getLabel(), entities));
 
-        criteria.setFetchMode("experiment", FetchMode.SELECT);
-        criteria.setFetchMode("sample", FetchMode.SELECT);
-        criteria.setFetchMode("dataSet", FetchMode.SELECT);
-        criteria.setFetchMode("material", FetchMode.SELECT);
+        final List<MetaprojectAssignmentPE> assignments = new ArrayList<>();
 
-        final List<MetaprojectAssignmentPE> assignments =
-                cast(getHibernateTemplate().findByCriteria(criteria));
+        InQueryScroller<? extends IEntityInformationWithPropertiesHolder> entitiesScroller = new InQueryScroller<>(entities, 1);
+        List<? extends IEntityInformationWithPropertiesHolder> partialEntities = null;
+
+        while ((partialEntities = entitiesScroller.next()) != null)
+        {
+            final DetachedCriteria criteria = DetachedCriteria.forClass(MetaprojectAssignmentPE.class);
+            criteria.createAlias("metaproject", "m");
+            criteria.add(Restrictions.eq("m.owner", owner));
+            criteria.add(Restrictions.in(entityKind.getLabel(), partialEntities));
+
+            criteria.setFetchMode("experiment", FetchMode.SELECT);
+            criteria.setFetchMode("sample", FetchMode.SELECT);
+            criteria.setFetchMode("dataSet", FetchMode.SELECT);
+            criteria.setFetchMode("material", FetchMode.SELECT);
+
+            final List<MetaprojectAssignmentPE> partialAssignments = cast(getHibernateTemplate().findByCriteria(criteria));
+            assignments.addAll(partialAssignments);
+        }
 
         if (operationLog.isDebugEnabled())
         {
-- 
GitLab