2012-07-04 83 views
0

我使用的是OpenJPA 2.2.0,當我執行選擇語句時,出現「列索引超出範圍,0 < 1」的錯誤。獲取列索引超出範圍,0 <1

EntityManager entityMgrObj = emf.getEntityManager(); 

entityMgrObj.clear(); 

Query query = entityMgrObj.createNativeQuery("select * from company_user where user_id = 1001); 

List<CompanyUserDO> companyUserDOObj = null; 

try { 
    companyUserDOObj = query.getResultList(); 
} catch (Exception e) { 
    System.out.println(e.getMessage()); 
} 

當使用Query.getResultList()執行我得到 「列索引超出範圍,0 < 1」 的錯誤。有人能讓我知道上述代碼中的錯誤嗎?

@UPDATE

當我不明白下面的堆棧異常被打印在控制檯上。

Exception in thread "main" <openjpa-2.2.0-r422266:1244990 fatal general error> org.apache.openjpa.persistence.PersistenceException: Column Index out of range, 0 < 1. 
FailedObject: select * from company_user where user_id=1001 [java.lang.String] 
at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4918) 
at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4878) 
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136) 
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:118) 
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:70) 
at org.apache.openjpa.jdbc.kernel.GenericResultObjectProvider.handleCheckedException(GenericResultObjectProvider.java:125) 
at org.apache.openjpa.lib.rop.EagerResultList.<init>(EagerResultList.java:40) 
at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1251) 
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1007) 
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863) 
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794) 
at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542) 
at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286) 
at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302) 
at zumigo.geofence.test.dalTest.main(dalTest.java:62) 
Caused by: java.sql.SQLException: Column Index out of range, 0 < 1. 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) 
at com.mysql.jdbc.ResultSetImpl.checkColumnBounds(ResultSetImpl.java:812) 
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5651) 
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570) 
at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:213) 
at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:213) 
at org.apache.openjpa.lib.jdbc.DelegatingResultSet.getString(DelegatingResultSet.java:121) 
at org.apache.openjpa.jdbc.sql.DBDictionary.getString(DBDictionary.java:886) 
at org.apache.openjpa.jdbc.sql.ResultSetResult.getStringInternal(ResultSetResult.java:474) 
at org.apache.openjpa.jdbc.sql.AbstractResult.getString(AbstractResult.java:767) 
at org.apache.openjpa.jdbc.meta.strats.StringFieldStrategy.getPrimaryKeyValue(StringFieldStrategy.java:217) 
at org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:188) 
at org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:147) 
at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1002) 
at org.apache.openjpa.jdbc.kernel.GenericResultObjectProvider.getResultObject(GenericResultObjectProvider.java:93) 
at org.apache.openjpa.lib.rop.EagerResultList.<init>(EagerResultList.java:36) 
... 8 more 

@UPDATE 2 搜索和調試發現persistence.xml文件被指向一箇舊的數據庫,因此這是給上述錯誤之後。

更改了數據庫URL並且應用程序工作正常。 :)

+0

對我來說是「*」:我不知道OpenJPA的,但我的兩分錢是,它試圖通過列名獲取列的索引,但在這種情況下它不能並返回0,這是一個非有效的值。對不起,如果這不能幫助你,但我甚至不是一個真正的開發人員:D –

+0

我不認爲是這種情況,因爲我能執行以下查詢'select * from用戶,其中用戶名如xxx和密碼像yyy' – Natraj

回答

0

不確定,但你似乎使用持久性上下文(因爲你使用clear方法)。你嘗試使用

createQuery 

方法,而不是

createNativeQuery 

一個?它將使用JPA持久化上下文,它適用於我的Java EE項目。 祝你好運。

+0

我想使用Native SQL查詢。 'createQuery'用於基於「JAVA持久性查詢語言」的查詢。我對嗎? – Natraj

+0

是的。但兩者看起來都很相似(特別是對於這樣一個簡單的查詢) – Tuxer

+0

兩者都做同樣的工作,但客戶端只需要Native SQL。 – Natraj

-1

我也有這個問題。您可以更改

companyUserDOObj = query.getResultList(); 

companyUserDOObj.addAll(query.getResultList());