Derby — java.sql.SQLException: столбец ‘table.column_name’ не найден

#java #mysql #sql #inner-join #derby

#java #mysql #sql #внутреннее объединение #дерби

Вопрос:

У меня есть эти 2 таблицы: inventory и product_categories обе таблицы имеют общий столбец с именем businessId .

Теперь у меня есть 2 базы данных, одна размещена в MySQL, а другая в Derby, обе базы данных имеют одинаковые структуры таблиц.

Итак, я выполнил следующий запрос для обеих баз данных:

 SELECT * 
FROM INVENTORY
INNER JOIN PRODUCT_CATEGORIES
    ON INVENTORY.BUSINESSID = PRODUCT_CATEGORIES.BUSINESSID
    AND INVENTORY.CATEGORY = PRODUCT_CATEGORIES.CATEGORYNAME
WHERE INVENTORY.BUSINESSID = 1
  

Когда я выполняю запрос выше, используя приведенный ниже Java-код, я получаю успешное ResultSet в обеих базах данных, однако Derby выдает исключение, когда я пытаюсь получить businessId столбец из product_categories таблицы

 try(Connection conn = dbConfig.getDatabaseConnection())
{
    PreparedStatement pst = conn.prepareStatement(sql);
    pst.setInt(1, businessId);
    List<Product> products = new ArrayList<>();
    ResultSet rs = pst.executeQuery();
    while(rs.next())
    {
        ...
        int businessId = rs.getInt("product_categories.businessId"); //<-- This lines throws an exception
        ...
    }
}
  

Я получаю это сообщение об ошибке:

java.sql.SQLException: столбец ‘product_categories.BusinessID’ не найден

Пожалуйста, что здесь происходит не так?

Комментарии:

1. Просто : int businessId = rs.getInt("businessId")

Ответ №1:

Столбцы в результирующем наборе не имеют префикса с псевдонимами таблицы.

Заменить:

 int businessId = rs.getInt("product_categories.businessId");
  

С:

 int businessId = rs.getInt("businessId");
  

ПРИМЕЧАНИЕ: использование SELECT * обычно не очень хорошая практика; лучше явно перечислить столбцы, которые вы хотите вернуть запросом. Это делает отступ запроса более четким и может помочь избежать конфликтов имен, когда одно и то же имя столбца существует в разных таблицах, которые используются в запросе.

Ответ №2:

Вероятно, это связано с различием в имени ключа для столбца в наборе результатов. Попробуйте выполнить запрос в своей базе данных, а затем скопируйте и вставьте имя столбца оттуда.

Вероятно, это должно быть BUSINESSID или businessid .

Рекомендуется использовать alias для имен столбцов, когда вы объединяете несколько таблиц с одинаковым именем столбца.