2012-10-18 75 views
1

添加ALIAS_COLUMN_NAME = TRUE到JDBC URL 應該意味着H2允許「別名」中列名,即你可以這樣做:H2數據庫ALIAS_COLUMN_NAME = TRUE似乎沒有奏效

resultSet.getString("p.first_name") 

如果p某個表的別名。

package com.example; 

import junit.framework.TestCase; 
import org.apache.commons.dbcp.BasicDataSource; 
import org.h2.Driver; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.jdbc.core.RowCallbackHandler; 
import org.springframework.jdbc.core.simple.SimpleJdbcInsert; 

import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.HashMap; 

/** 
* H2 Spring Test 
*/ 
public class H2SelectTest extends TestCase { 
    public void testQuery() throws Exception { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(Driver.class.getName()); 
     dataSource.setUrl("jdbc:h2:mem:test;ALIAS_COLUMN_NAME=TRUE"); 
     dataSource.setUsername("sa"); 
     dataSource.setPassword(""); 
     JdbcTemplate template = new JdbcTemplate(dataSource); 
     template.afterPropertiesSet(); 
     template.execute("create table people(id int auto_increment, first_name varchar);"); 
     SimpleJdbcInsert insert = new SimpleJdbcInsert(template).withTableName("people"); 
     insert.setGeneratedKeyName("id"); 
     insert.compile(); 
     HashMap<String, Object> map = new HashMap<String, Object>(); 
     map.put("first_name", "Bob"); 
     insert.execute(map); 
     template.query("select p.first_name from people p", new RowCallbackHandler() { 
      public void processRow(ResultSet rs) throws SQLException { 
       String name = rs.getString("p.first_name"); 
      } 
     }); 
    } 
} 

導致這個錯誤:

Caused by: org.h2.jdbc.JdbcSQLException: Column "p.first_name" not found [42122-168] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 
    at org.h2.message.DbException.get(DbException.java:169) 
    at org.h2.message.DbException.get(DbException.java:146) 
    at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:2918) 
    at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:2979) 
    at org.h2.jdbc.JdbcResultSet.getString(JdbcResultSet.java:291) 
    at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:225) 
    at com.example.H2SelectTest$1.processRow(H2SelectTest.java:35) 
    at org.springframework.jdbc.core.JdbcTemplate$RowCallbackHandlerResultSetExtractor.extractData(JdbcTemplate.java:1482) 
    at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:446) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:396) 
    ... 19 more 
+0

您列出的測試用例不使用'd.name'。你能更新測試用例或異常堆棧跟蹤嗎? –

+0

哈哈。感謝和發現!錯誤的堆棧跟蹤。來自原始問題,而不是示例。已修復。 –

回答

3

這裏就是你要找的答案:此代碼所示。這似乎並沒有爲我工作

原來ALIAS_COLUMN_NAME是用於列名稱而不是用於表格別名的按照這些文檔:

/** 
    * System property <code>h2.aliasColumnName</code>.<br /> 
    * When enabled, aliased columns (as in SELECT ID AS I FROM TEST) return the 
    * alias (I in this case) in ResultSetMetaData.getColumnName() and 'null' in 
    * getTableName(). If disabled, the real column name (ID in this case) and 
    * table name is returned. This setting only affects the default mode. 
    **/ 

它也tur在使用表別名查詢結果集時,只有MySQL支持並且不受JDBC規範支持。您可以使用H2中的完整表名來消除歧義列,例如resultSet.getString(「people.first_name」),但我擔心,如果您使用h2對通常針對MySQL運行的代碼執行內部測試,則必須找到另一種方式(例如,不要別名和使用完整的表格名稱)。

如果您需要任何其他幫助,通過我,請給我留言。

+0

MySQL的有趣的行爲,我不知道這一點。謝謝! –