нотация table.field с SQL Server JDBC?

У меня проблема с драйвером JDBC SQL Server, я попробовал драйвер Microsoft JDBC, а также драйвер JTDS, но у них обоих одна и та же проблема: в ResultSet, если я ищу «table.field», я получаю сообщение об ошибке «недопустимое имя столбца». ", но если я ищу только "поле", это работает. Это проблема для меня, потому что у меня есть приложение, которое автоматически генерирует запросы и использует нотацию «таблица.поле», на данный момент я работал над MySQL и Postgresql, и это работало нормально, но теперь мне нужно добавить поддержку SQL Server и Я нашел эту проблему. Это проблема неправильной настройки драйвера или они только так работают? Есть другие драйвера?

Я также нашел случай, когда я не могу заставить работать, например, я создал две таблицы с полем с одинаковым именем и сделал между ними декартово произведение.

Таблицы t1,t2 идентичны и имеют такую ​​структуру

------
| id | 
------
| 1  | 
------
| 2  | 
------

Если я выполню запрос

SELECT * FROM t1,t2

на SQL Server результат будет

-----------
| id | id |
-----------
| 1  | 1  |
-----------
| 1  | 2  |
-----------
| 2  | 1  |
-----------
| 2  | 2  |
-----------

Но из Java с использованием драйвера JDBC я не могу получить тот же результат, потому что я не могу получить доступ к t1.id, t2.id, а только к id, и он возвращает только первый столбец.

Вот пример кода

Connection conn = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/test", "user", "pass");         
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM t1, t2");
while(rs.next()){
    System.out.println(rs.getString("id"));   //This works
    System.out.println(rs.getString("t1.id"));//This not works
}

person Gaglia88    schedule 18.04.2016    source источник
comment
Что должно быть результатом этого запроса? Вы получаете декартово произведение. В этом смысл?   -  person Jens    schedule 18.04.2016
comment
вы должны обрабатывать это на уровне запроса и назначать псевдонимы t1 и t2.   -  person jmcg    schedule 18.04.2016
comment
Я думаю, это то, что вы ищете stackoverflow.com/questions/7224024/   -  person Amal    schedule 18.04.2016
comment
Йенс, результат запроса должен быть декартовым произведением, это просто пример, показывающий проблему, с которой я столкнулся. @ Амаль, верно, это именно мой случай, поэтому я должен добавить псевдоним в каждый столбец ... Я бы предпочел автоматическую систему, я имею в виду, что драйверы JDBC для других систем (например, MySQL, Postgresql) делают это автоматически, но хорошо. .. Спасибо! :)   -  person Gaglia88    schedule 18.04.2016
comment
JDBC требует извлечения только по метке столбца, имя таблицы (или псевдоним таблицы) не является частью метки столбца.   -  person Mark Rotteveel    schedule 18.04.2016


Ответы (1)


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

Connection conn = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/test", "user", "pass");         
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT t1.id as col1,t2.id as col2 FROM t1, t2");
while(rs.next()){
    System.out.println(rs.getString("col1"));  

}
person Ponmani Chinnaswamy    schedule 18.04.2016