2016-12-07 21 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