diff --git a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php
index 95936c076cc9742fc8f253f8a147f74c07b6fae0..0e4564bdcca9d8d6514adec5f8f26ad50f68aea1 100644
--- a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php
+++ b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php
@@ -674,23 +674,24 @@ class Typo3DbQueryParser
      */
     protected function getVisibilityConstraintStatement(QuerySettingsInterface $querySettings, $tableName, $tableAlias)
     {
-        $statement = '';
-        if (is_array($GLOBALS['TCA'][$tableName]['ctrl'] ?? null)) {
-            $ignoreEnableFields = $querySettings->getIgnoreEnableFields();
-            $enableFieldsToBeIgnored = $querySettings->getEnableFieldsToBeIgnored();
-            $includeDeleted = $querySettings->getIncludeDeleted();
-            if (($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface
-                && ApplicationType::fromRequest($GLOBALS['TYPO3_REQUEST'])->isFrontend()
-            ) {
-                $statement .= $this->getFrontendConstraintStatement($tableName, $ignoreEnableFields, $enableFieldsToBeIgnored, $includeDeleted);
-            } else {
-                // applicationType backend
-                $statement .= $this->getBackendConstraintStatement($tableName, $ignoreEnableFields, $includeDeleted);
-            }
-            if (!empty($statement)) {
-                $statement = $this->replaceTableNameWithAlias($statement, $tableName, $tableAlias);
-                $statement = strtolower(substr($statement, 1, 3)) === 'and' ? substr($statement, 5) : $statement;
-            }
+        if (!is_array($GLOBALS['TCA'][$tableName]['ctrl'] ?? null)) {
+            return '';
+        }
+
+        $ignoreEnableFields = $querySettings->getIgnoreEnableFields();
+        $enableFieldsToBeIgnored = $querySettings->getEnableFieldsToBeIgnored();
+        $includeDeleted = $querySettings->getIncludeDeleted();
+        if (($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface
+            && ApplicationType::fromRequest($GLOBALS['TYPO3_REQUEST'])->isFrontend()
+        ) {
+            $statement = $this->getFrontendConstraintStatement($tableName, $ignoreEnableFields, $enableFieldsToBeIgnored, $includeDeleted);
+        } else {
+            // applicationType backend
+            $statement = $this->getBackendConstraintStatement($tableName, $ignoreEnableFields, $includeDeleted);
+        }
+        if (!empty($statement)) {
+            $statement = $this->replaceTableNameWithAlias($statement, $tableName, $tableAlias);
+            $statement = strtolower(substr($statement, 1, 3)) === 'and' ? substr($statement, 5) : $statement;
         }
         return $statement;
     }
@@ -853,7 +854,7 @@ class Typo3DbQueryParser
      */
     protected function getPageIdStatement($tableName, $tableAlias, array $storagePageIds)
     {
-        if (!is_array($GLOBALS['TCA'][$tableName]['ctrl'])) {
+        if (!is_array($GLOBALS['TCA'][$tableName]['ctrl'] ?? null)) {
             return '';
         }
 
diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Model/RegistryEntry.php b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Model/RegistryEntry.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f21607f4b41dba3d3a0f2ae8f502e2acf3785cc
--- /dev/null
+++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Model/RegistryEntry.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+namespace TYPO3Tests\BlogExample\Domain\Model;
+
+use TYPO3\CMS\Extbase\DomainObject\AbstractValueObject;
+
+/**
+ * A registry entry
+ */
+class RegistryEntry extends AbstractValueObject
+{
+    protected string $name = '';
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function setName(string $name): void
+    {
+        $this->name = $name;
+    }
+}
diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/RegistryEntryRepository.php b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/RegistryEntryRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..7442fed9e20d0d2189196baa878185affc17204d
--- /dev/null
+++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/RegistryEntryRepository.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+namespace TYPO3Tests\BlogExample\Domain\Repository;
+
+use TYPO3\CMS\Extbase\Persistence\Repository;
+use TYPO3Tests\BlogExample\Domain\Model\RegistryEntry;
+
+/**
+ * A repository for registry entries
+ * @extends Repository<RegistryEntry>
+ */
+class RegistryEntryRepository extends Repository {}
diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Configuration/TCA/tx_blogexample_domain_model_registryentry.php b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Configuration/TCA/tx_blogexample_domain_model_registryentry.php
new file mode 100644
index 0000000000000000000000000000000000000000..2d57b61e7b366a66846c4656e465a358001462d6
--- /dev/null
+++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Configuration/TCA/tx_blogexample_domain_model_registryentry.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+return [
+    'columns' => [
+        'name' => [
+            'label' => 'LLL:EXT:blog_example/Resources/Private/Language/locallang_db.xlf:tx_blogexample_domain_model_registryentry.name',
+            'config' => [
+                'type' => 'input',
+            ],
+        ],
+    ],
+];
diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Resources/Private/Language/locallang_db.xlf b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Resources/Private/Language/locallang_db.xlf
index 39e9964776ad9556e2670356fb1a4ee75a9c8935..ee401cfdab1ba0e55cfe195b1db19750be0aa991 100644
--- a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Resources/Private/Language/locallang_db.xlf
+++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Resources/Private/Language/locallang_db.xlf
@@ -111,6 +111,9 @@
 			<trans-unit id="tx_blogexample_domain_model_comment.content" resname="tx_blogexample_domain_model_comment.content">
 				<source>Content</source>
 			</trans-unit>
+			<trans-unit id="tx_blogexample_domain_model_registryentry.name" resname="tx_blogexample_domain_model_registryentry.name">
+				<source>Registry Entry Key</source>
+			</trans-unit>
 			<trans-unit id="tx_blogexample_domain_model_tag" resname="tx_blogexample_domain_model_tag">
 				<source>Tag</source>
 			</trans-unit>
diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/ext_tables.sql b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/ext_tables.sql
index f105a7eb0c58fb29f99e3c19b96330cb6d9833da..6af59f31c715a9dbc98f68e94a9c42eb54408354 100644
--- a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/ext_tables.sql
+++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/ext_tables.sql
@@ -53,6 +53,13 @@ CREATE TABLE tx_blogexample_domain_model_person (
 	tags_special int(11) unsigned DEFAULT '0' NOT NULL
 );
 
+#
+# Table structure for table 'tx_blogexample_domain_model_registryentry'
+#
+CREATE TABLE tx_blogexample_domain_model_registryentry (
+  name varchar(255) DEFAULT '' NOT NULL
+);
+
 #
 # Table structure for table 'tx_blogexample_domain_model_tag'
 #
diff --git a/typo3/sysext/extbase/Tests/Functional/Persistence/Generic/Storage/Typo3DbQueryParserTest.php b/typo3/sysext/extbase/Tests/Functional/Persistence/Generic/Storage/Typo3DbQueryParserTest.php
index cf5d6a1f05c95d92236f8f078ebaf7df8c1cb4a6..8cc41b33274846b1efcd6199ba6ba2685d2f9f18 100644
--- a/typo3/sysext/extbase/Tests/Functional/Persistence/Generic/Storage/Typo3DbQueryParserTest.php
+++ b/typo3/sysext/extbase/Tests/Functional/Persistence/Generic/Storage/Typo3DbQueryParserTest.php
@@ -36,6 +36,7 @@ use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings;
 use TYPO3\CMS\Extbase\Persistence\QueryInterface;
 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
 use TYPO3Tests\BlogExample\Domain\Repository\BlogRepository;
+use TYPO3Tests\BlogExample\Domain\Repository\RegistryEntryRepository;
 
 final class Typo3DbQueryParserTest extends FunctionalTestCase
 {
@@ -799,4 +800,25 @@ final class Typo3DbQueryParserTest extends FunctionalTestCase
         $compositeExpression = $queryBuilder->getQueryPart('where');
         self::assertMatchesRegularExpression($expectedSql, (string)$compositeExpression);
     }
+
+    /**
+     * @test
+     */
+    public function tcaWithoutCtrlCreatesAValidSQLStatement(): void
+    {
+        $GLOBALS['TYPO3_REQUEST'] = (new ServerRequest())
+            ->withAttribute('applicationType', SystemEnvironmentBuilder::REQUESTTYPE_BE);
+        $registryEntryRepository = $this->get(RegistryEntryRepository::class);
+        $querySettings = new Typo3QuerySettings(new Context(), $this->get(ConfigurationManagerInterface::class));
+
+        $query = $registryEntryRepository->createQuery();
+        $query->setQuerySettings($querySettings);
+
+        $typo3DbQueryParser = $this->get(Typo3DbQueryParser::class);
+        $queryBuilder = $typo3DbQueryParser->convertQueryToDoctrineQueryBuilder($query);
+
+        $compositeExpression = $queryBuilder->getQueryPart('where');
+        self::assertStringNotContainsString('hidden', (string)$compositeExpression);
+        self::assertStringNotContainsString('deleted', (string)$compositeExpression);
+    }
 }