diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
index 7c87c8bb94cb919ae02db4e5c067e1a33abc7731..9888775156304e611b0419a3b7eebc37eda2770b 100644
--- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
@@ -212,36 +212,49 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
   public MultiTransactionResponse retrieve(final MultiTransactionRequest request) throws Exception {
     final MultiTransactionResponse.Builder builder = MultiTransactionResponse.newBuilder();
     final RetrieveContainer container =
-        new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null);
+        new RetrieveContainer(
+            SecurityUtils.getSubject(), getTimestamp(), getSRID(), new HashMap<>());
 
     for (final TransactionRequest sub_request : request.getRequestsList()) {
-      final String id = sub_request.getRetrieveRequest().getId();
-      try {
-        final RetrieveEntity entity = new RetrieveEntity(getId(id));
-        container.add(entity);
-      } catch (final NumberFormatException e) {
-        // We handle this after the retrieval
+      if (sub_request.getRetrieveRequest().hasQuery()
+          && !sub_request.getRetrieveRequest().getQuery().getQuery().isBlank()) {
+        container.getFlags().put("query", sub_request.getRetrieveRequest().getQuery().getQuery());
+      } else {
+        final String id = sub_request.getRetrieveRequest().getId();
+        if (!id.isBlank()) {
+          try {
+            final RetrieveEntity entity = new RetrieveEntity(getId(id));
+            container.add(entity);
+          } catch (final NumberFormatException e) {
+            // We handle this after the retrieval
+          }
+        }
       }
     }
 
     final Retrieve transaction = new Retrieve(container);
     transaction.execute();
+    for (final EntityInterface entity : container) {
+      builder
+          .addResponsesBuilder()
+          .setRetrieveResponse(RetrieveResponse.newBuilder().setEntity(convert(entity)));
+    }
 
+    // Add those entities which have not been retrieved because the have a string id
     for (final TransactionRequest sub_request : request.getRequestsList()) {
       final String id = sub_request.getRetrieveRequest().getId();
-      try {
-        final EntityInterface entity = container.getEntityById(getId(id));
-
-        builder.addResponses(
-            TransactionResponse.newBuilder()
-                .setRetrieveResponse(RetrieveResponse.newBuilder().setEntity(convert(entity))));
-      } catch (final NumberFormatException e) {
-        // ID wasn't an integer - the server doesn't support string id's yet, so that entity cannot
-        // exist.
-        builder.addResponses(
-            TransactionResponse.newBuilder()
-                .setRetrieveResponse(
-                    RetrieveResponse.newBuilder().setEntity(entityDoesNotExist(id))));
+      if (!id.isBlank()) {
+        try {
+          getId(id);
+        } catch (final NumberFormatException e) {
+          // ID wasn't an integer - the server doesn't support string id's yet, so that entity
+          // cannot
+          // exist.
+          builder.addResponses(
+              TransactionResponse.newBuilder()
+                  .setRetrieveResponse(
+                      RetrieveResponse.newBuilder().setEntity(entityDoesNotExist(id))));
+        }
       }
     }
     return builder.build();