diff --git a/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php b/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php
index 0c09ec9..421b810 100644
--- a/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php
+++ b/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\Query\QueryException;
 use Drupal\Core\Entity\Sql\SqlEntityStorageInterface;
+use Drupal\Core\TypedData\DataReferenceDefinitionInterface;
 
 /**
  * Adds tables and fields to the SQL entity query.
@@ -203,9 +204,10 @@ public function addField($field, $type, $langcode) {
           $next_index_prefix = $relationship_specifier;
         }
         // Check for a valid relationship.
-        if (isset($propertyDefinitions[$relationship_specifier]) && $field_storage->getPropertyDefinition('entity')->getDataType() == 'entity_reference' ) {
+        $property = preg_match('/^entity([^a-zA-Z_0-9]|$)/', $relationship_specifier) ? 'entity' : $relationship_specifier;
+        if (isset($propertyDefinitions[$property]) && $propertyDefinitions[$property] instanceof DataReferenceDefinitionInterface) {
           // If it is, use the entity type.
-          $entity_type_id = $propertyDefinitions[$relationship_specifier]->getTargetDefinition()->getEntityTypeId();
+          $entity_type_id = $propertyDefinitions[$property]->getTargetDefinition($relationship_specifier)->getEntityTypeId();
           $entity_type = $this->entityManager->getDefinition($entity_type_id);
           $field_storage_definitions = $this->entityManager->getFieldStorageDefinitions($entity_type_id);
           // Add the new entity base table using the table and sql column.
diff --git a/core/lib/Drupal/Core/TypedData/DataReferenceDefinition.php b/core/lib/Drupal/Core/TypedData/DataReferenceDefinition.php
index 23fb420..982aed6 100644
--- a/core/lib/Drupal/Core/TypedData/DataReferenceDefinition.php
+++ b/core/lib/Drupal/Core/TypedData/DataReferenceDefinition.php
@@ -50,7 +50,7 @@ public static function createFromDataType($data_type) {
   /**
    * {@inheritdoc}
    */
-  public function getTargetDefinition() {
+  public function getTargetDefinition($relationship_specifier = NULL) {
     return $this->targetDefinition;
   }
 
diff --git a/core/lib/Drupal/Core/TypedData/DataReferenceDefinitionInterface.php b/core/lib/Drupal/Core/TypedData/DataReferenceDefinitionInterface.php
index a7f2df5..eef2846 100644
--- a/core/lib/Drupal/Core/TypedData/DataReferenceDefinitionInterface.php
+++ b/core/lib/Drupal/Core/TypedData/DataReferenceDefinitionInterface.php
@@ -20,9 +20,14 @@
   /**
    * Gets the data definition of the referenced data.
    *
+   * @param string $relationship_specifier
+   *   (optional) The relationship specifier for entity query.
+   *
+   * @see \Drupal\Core\Entity\Query\Sql\Tables::addField().
+   *
    * @return \Drupal\Core\TypedData\DataDefinitionInterface
    *   The data definition of the referenced data.
    */
-  public function getTargetDefinition();
+  public function getTargetDefinition($relationship_specifier = NULL);
 
 }
