小心Derby的ResultSet陷阱

GD Star Rating
loading...

Derby作为一个纯Java实现的嵌入式DB一直很受Java社区的欢迎,在我们的项目中也用到了。但昨天晚上遇到的一个问题让我对Derby相当失望——Derby实现的ResultSet会将列名中的表名抹掉
具体代码:
SQL:

SELECT staff.staffid FROM staff WHERE ...

JDBC:

  1. ResultSet rs = stmt.executeQuery(...);
  2. if(rs.next()){
  3.     String id = rs.getString("staff.id");
  4. }
ResultSet rs = stmt.executeQuery(...);
if(rs.next()){
    String id = rs.getString("staff.id");
}

运行时抛出异常:

  1. Caused by: java.sql.SQLException: 列“staff.staffid”未找到。
  2.     at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
  3.     at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
  4.     at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
  5.     at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
  6.     at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
  7.     at org.apache.derby.impl.jdbc.ConnectionChild.newSQLException(Unknown Source)
  8.     at org.apache.derby.impl.jdbc.EmbedResultSet.findColumnName(Unknown Source)
  9.     at org.apache.derby.impl.jdbc.EmbedResultSet.getString(Unknown Source)
Caused by: java.sql.SQLException: 列“staff.staffid”未找到。
	at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.ConnectionChild.newSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedResultSet.findColumnName(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedResultSet.getString(Unknown Source)

如果将select语句中的“staff.staffid”改成“staffid”则不会抛出上述异常。在项目中为了保持数量庞大的SQL语句的正确性和可维护性,一般会将表名、列名定义为常量。这样对于Derby数据库就需要一套特殊的、不带表名的列名常量,给代码维护带来很大的麻烦。不知道Sun将Derby这样实现的原因是什么,这个功能点的实现也不是很麻烦,打算去提交bug

原创内容,转载请注明: 转载自拈花微笑

本文链接地址: 小心Derby的ResultSet陷阱

685

One comment

  • 2007 年 07 月 16 日 - 下午 2:45 | Permalink
    GD Star Rating
    loading...
    你都写书了呀?
  • 发表评论

    电子邮件地址不会被公开。 必填项已用 * 标注

    *

    您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" extra="">

    :wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!:

    使用新浪微博登陆

    无觅相关文章插件,快速提升流量