Java 无效的列类型:getInt 未为类 oracle.jdbc.driver.T4CRowidAccessor 实现
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19270465/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Invalid column type: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor
提问by Ahmad
i want to post data in oracle database 11g and i enter the data using input field the the data enter to data base but just id coulmn and another string coulmn are get correct data but another coulmn get null or 0 so i can not resolve this problem and in run time i have this error
我想在 oracle 数据库 11g 中发布数据,我使用输入字段输入数据,数据输入到数据库,但只有 id coulmn 和另一个字符串 coulmn 获得正确的数据,但另一个 coulmn 获得 null 或 0 所以我无法解决这个问题在运行时我有这个错误
Invalid column type: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor
Invalid column type: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor
this is my code
这是我的代码
public Client newClient(Client client){
try {
con = DBConnection.getConnection(driver, url, name, pass);
pstmt = con.prepareStatement("INSERT INTO CLIENT (CID, FIRSTNAME, LASTNAME, CAREER, CSALARY) VALUES (CLIENT_ID.nextval, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, client.getFirstName());
pstmt.setString(2, client.getLastName());
pstmt.setString(3, client.getCareer());
pstmt.setInt(4, client.getcSalary());
pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
rs.next();
Integer id = rs.getInt(1);
client.setcId(id);
}catch(Exception ex){
ex.printStackTrace();
return null;
}finally{
try{ rs.close(); }catch (Exception e){}
try{ pstmt.close();}catch (Exception e){}
try{ con.close();}catch (Exception e){}
}//finally
return client;
}
}
}
@XmlRootElement
public class Client {
private Integer cId;
private String firstName;
private String lastName;
private String career;
private int cSalary;
public Integer getcId() {
return cId;
}
public void setcId(Integer cId) {
this.cId = cId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getCareer() {
return career;
}
public void setCareer(String career) {
this.career = career;
}
public int getcSalary() {
return cSalary;
}
public void setcSalary(int cSalary) {
this.cSalary = cSalary;
}
}
}
and this is my SQL
这是我的 SQL
CREATE TABLE "AHMAD"."CLIENT"
( "CID" NUMBER(*,0) NOT NULL ENABLE,
"FIRSTNAME" VARCHAR2(255 BYTE),
"LASTNAME" VARCHAR2(255 BYTE),
"CAREER" VARCHAR2(255 BYTE),
"CSALARY" NUMBER,
CONSTRAINT "CLIENT_PK" PRIMARY KEY ("CID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
plz help me the data is insert into table but not completly and i have this run time error
请帮我将数据插入表但不完全,我有这个运行时错误
java.sql.SQLException: Invalid column type: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.Accessor.unimpl(Accessor.java:358)
at oracle.jdbc.driver.Accessor.getInt(Accessor.java:468)
at oracle.jdbc.driver.OracleReturnResultSet.getInt(OracleReturnResultSet.java:265)
at com.rest.client.ClientDAO.newClient(ClientDAO.java:99)
at com.rest.client.ClientResourcs.newClient(ClientResourcs.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory.invoke(JavaMethodInvokerFactory.jav a:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
回答by Mark Rotteveel
The Oracle JDBC driver does not return the generated id when using Statement.RETURN_GENERATED_KEYS
so the first column of the generated keys ResultSet
is not an int
, instead it returns a ROWID
(see the JDBC tutorial on rowids) of the inserted row (so you can query the row yourself). As far as I know the reason for this is that Oracle does not have an identity type, so it doesn't actually know which field is the generated key.
在使用Oracle JDBC驱动程序不返回生成的ID Statement.RETURN_GENERATED_KEYS
,因此生成的密钥的第一列ResultSet
是不是一个int
,而是返回ROWID
(参见上的rowid JDBC教程)插入行(这样你就可以查询该行自己)。据我所知,原因是 Oracle 没有身份类型,因此它实际上并不知道哪个字段是生成的密钥。
Instead you should be able to explicitly specify the column you want returned using prepareStatement(String sql, int[] columnIndexes)
or prepareStatement(String sql, String[] columnNames)
.
相反,您应该能够使用prepareStatement(String sql, int[] columnIndexes)
or明确指定要返回的列prepareStatement(String sql, String[] columnNames)
。
回答by Ali Bassam
Like Mark suggested, I just faced the same problem and found the solution:
就像马克建议的那样,我刚刚遇到了同样的问题并找到了解决方案:
String generatedColumns[] = { "ID" };
stmt = con.prepareStatement(query, generatedColumns);
And after you execute the query, do the following to fetch the inserted ID.
执行查询后,执行以下操作以获取插入的 ID。
rs = stmt.getGeneratedKeys();
rs.next();
rs.getInt(1);
回答by somas
Dont know whether this issue is resoled or not but i faced same issue and it got resolved by replacing Integerwith intin entity class(in your case it is Clientclass)
不知道这个问题是否已解决,但我遇到了同样的问题,它通过在实体类中用int替换Integer来解决(在你的情况下它是Client类)