diff --git a/core/modules/migrate/src/Controller/MigrateMessageController.php b/core/modules/migrate/src/Controller/MigrateMessageController.php
index 385b89f343b8cfa8ee8f94c15a8c8a68480b18e3..a7e4ac29f9f81d3618b4c51e027639fb10e4cc59 100644
--- a/core/modules/migrate/src/Controller/MigrateMessageController.php
+++ b/core/modules/migrate/src/Controller/MigrateMessageController.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Database\Connection;
 use Drupal\Core\Database\DatabaseConnectionRefusedException;
 use Drupal\Core\Database\DatabaseNotFoundException;
+use Drupal\Core\Database\Query\SelectInterface;
 use Drupal\Core\Form\FormBuilderInterface;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\Core\Url;
@@ -189,10 +190,7 @@ public function details(string $migration_id, Request $request): array {
     $query->leftJoin($map_table, 'map', 'msg.source_ids_hash = map.source_ids_hash');
     $query->fields('msg');
     $query->fields('map');
-    $filter = $this->buildFilterQuery($request);
-    if (!empty($filter['where'])) {
-      $query->where($filter['where'], $filter['args']);
-    }
+    $this->addFilterToQuery($request, $query);
     $result = $query
       ->limit(50)
       ->orderByHeader($header)
@@ -238,54 +236,45 @@ public function details(string $migration_id, Request $request): array {
   }
 
   /**
-   * Builds a query for migrate message administration.
+   * Adds a filter to the query for migrate message administration.
+   *
+   * This method retrieves the session-based filters from the request and
+   * applies them to the provided query object. If no filters are present, the
+   * query is left unchanged.
    *
    * @param \Symfony\Component\HttpFoundation\Request $request
    *   The request.
-   *
-   * @return array|null
-   *   An associative array with keys 'where' and 'args' or NULL if there were
-   *   no filters set.
+   * @param \Drupal\Core\Database\Query\SelectInterface $query
+   *   The database query.
    */
-  protected function buildFilterQuery(Request $request): ?array {
+  protected function addFilterToQuery(Request $request, SelectInterface $query): void {
     $session_filters = $request->getSession()->get('migration_messages_overview_filter', []);
     if (empty($session_filters)) {
-      return NULL;
+      return;
     }
 
-    // Build query.
-    $where = $args = [];
+    // Build the condition.
     foreach ($session_filters as $filter) {
-      $filter_where = [];
-
+      if (empty($filter['value'])) {
+        continue;
+      }
       switch ($filter['type']) {
         case 'array':
-          foreach ($filter['value'] as $value) {
-            $filter_where[] = $filter['where'];
-            $args[] = $value;
+          $values = array_values($filter['value']);
+          if ($filter['field'] === 'msg.level') {
+            $values = array_map(fn($x) => (int) $x, $values);
           }
+          $query->condition($filter['field'], $values, 'IN');
           break;
 
         case 'string':
-          $filter_where[] = $filter['where'];
-          $args[] = '%' . $filter['value'] . '%';
+          $query->condition($filter['field'], "%{$filter['value']}%", 'LIKE');
           break;
 
         default:
-          $filter_where[] = $filter['where'];
-          $args[] = $filter['value'];
-      }
-
-      if (!empty($filter_where)) {
-        $where[] = '(' . implode(' OR ', $filter_where) . ')';
+          $query->condition($filter['field'], $filter['value']);
       }
     }
-    $where = !empty($where) ? implode(' AND ', $where) : '';
-
-    return [
-      'where' => $where,
-      'args' => $args,
-    ];
   }
 
   /**
diff --git a/core/modules/migrate/src/Form/MessageForm.php b/core/modules/migrate/src/Form/MessageForm.php
index 75522351418d19d88dd99ee46811dabb9ade4c72..78e62b2ce4615f8d3cc0f2f6f679ac3586dbf339 100644
--- a/core/modules/migrate/src/Form/MessageForm.php
+++ b/core/modules/migrate/src/Form/MessageForm.php
@@ -82,19 +82,19 @@ public function buildForm(array $form, FormStateInterface $form_state) {
   public function submitForm(array &$form, FormStateInterface $form_state) {
     $filters['message'] = [
       'title' => $this->t('message'),
-      'where' => 'msg.message LIKE ?',
+      'field' => 'msg.message',
       'type' => 'string',
     ];
     $filters['severity'] = [
       'title' => $this->t('Severity'),
-      'where' => 'msg.level = ?',
+      'field' => 'msg.level',
       'type' => 'array',
     ];
     $session_filters = $this->getRequest()->getSession()->get('migration_messages_overview_filter', []);
     foreach ($filters as $name => $filter) {
       if ($form_state->hasValue($name)) {
         $session_filters[$name] = [
-          'where' => $filter['where'],
+          'field' => $filter['field'],
           'value' => $form_state->getValue($name),
           'type' => $filter['type'],
         ];