2016-12-07 58 views
0

在其它數據庫語言,你可以組織你的查詢來定義表的實例,如:HSQL Java表列訪問問題

SELECT a.foo, a.bar FROM ACME a WHERE a.ID=1; 

,並執行類似

rs.getInt("a.foo"); 

獲得此表的第一行的值。我在hsql中做這個看似基本的功能時遇到了麻煩,並且想知道是否有簡單的解決方案,或者其他人是否已經體驗過這一點。如果我執行上面的查詢,並嘗試訪問「a.foo」我收到以下錯誤使用HSQL:

org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
org.hsqldb.jdbc.jdbcResultSet.findColumn(Unknown Source) 
org.hsqldb.jdbc.jdbcResultSet.getInt(Unknown Source) 

不過,如果我更改了訪問

rs.getInt("foo"); 

一切工作正常。是什麼賦予了?爲什麼hsql在查詢被定義爲這種方式時難以檢索'a.foo'?這些命令系列在MySQL中工作正常。

+0

您可能會發現在計算器非常有幫助這類似的問題及對策:HTTP:// stackoverflow.com/questions/7224024/jdbc-resultset-get-columns-with-table-alias –

+0

謝謝。不幸的是,這裏提供的解決方案類似於@davidxxx在下面提供的內容......修改所有查詢。這個語法看起來像所有rdbms應該支持的標準格式。 –

+0

當然,dbms支持語法。這裏的問題不是dbms,而是您用來與您的dmbs(JDBC驅動程序)進行通信的庫。當你編寫一個JPQL查詢時,它是同樣的事情,如果你希望它有效,你有一些規則和限制。 – davidxxx

回答

3

我不知道DBMS這個語法,但HSQLDB的行爲如何等行爲似乎匹配的

int java.sql.ResultSet.getInt(String columnLabel) throws SQLException 

規範檢索的 這個當前行中指定列的值ResultSet對象作爲Java編程語言中的一個int。

參數

columnLabel標籤與SQL AS子句指定的列。 如果未指定SQL AS子句,則標籤是 名字列返回:

在您的查詢,**a.fo**代表fo列。它不是別名。如果你想使用一個別名,你可以試試:

SELECT a.foo as 'myFoo', a.bar FROM ACME a WHERE a.ID=1; 

並獲得這樣的值:

rs.getInt("myFoo"); 
+0

謝謝。雖然你的解決方案當然可以工作,但這意味着我將不得不通過所有代碼並更改所有查詢來支持這個......我可能不得不這樣做。 –

+0

如果更改查詢有一定的代價,您可以嘗試使用H2數據庫,如果幸運的話,也許您可​​能會有其他行爲。但無論如何,如果你使用另一個dbms,你仍然有風險仍然存在問題。你確實別無選擇,只能重新編寫你的查詢。重寫jdbc驅動程序的一部分當然是一個非常糟糕的主意。 – davidxxx