2012-12-04 1 views
1
INSERT INTO rbp_users 
     (user_id, user_name, passwd, bank_id, descr, stat, p_exp, user_type_id, email_address) 
    VALUES 
     (rbp_userid_seq.NEXTVAL , 
     'any_user_name', 
     'some_encrypted_password', 
     1, 
     N'əəııööğğşşççüü', --unicode string 
     'E', 
     SYSDATE, 
     2, 
     NULL); 

NVARCHAR 필드가 "descr"인 Oracle 테이블에 위의 삽입은 PL/SQL Developer를 통해 잘 작동합니다. 하지만 MyBatis로 DAO 매퍼 XML에서 유니 코드 필드 전에 "N"를 쓸 수 없습니다 :Spring 통합을 사용하여 MyBatis를 사용하여 Oracle에 NVICE를 삽입하는 방법

<insert id="addUser" parameterType="User" flushCache="true"> 
    INSERT INTO rbp_users 
     (user_id, user_name, passwd, bank_id, descr, stat, p_exp, user_type_id, email_address) 
    VALUES 
     (rbp_userid_seq.NEXTVAL , 
     #{userName,   javaType=String,  jdbcType=VARCHAR}, 
     pswcode(#{password, javaType=String,  jdbcType=VARCHAR}), 
     #{bankId,    javaType=Integer, jdbcType=NUMERIC}, 
     N#{description,   javaType=String,  jdbcType=NVARCHAR}, 
     #{userStatus,   javaType=String,  jdbcType=VARCHAR}, 
     #{passwordExpireDate, javaType=Date,  jdbcType=DATE}, 
     #{userTypeId,   javaType=Integer, jdbcType=NUMERIC}, 
     #{emailAddress,  javaType=String,  jdbcType=VARCHAR}) 

    <selectKey resultType="java.lang.Integer" keyProperty="userId"> 
     SELECT rbp_userid_seq.currval from dual 
    </selectKey> 
</insert> 

이 제기 및 오류 :

org.springframework.jdbc.InvalidResultSetAccessException: Error setting null for parameter #8 with JdbcType VARCHAR . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: Invalid column index 
; invalid ResultSet access for SQL []; nested exception is java.sql.SQLException: Invalid column index 
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:237) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71) 
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365) 
    at $Proxy20.insert(Unknown Source) 
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:237) 
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:79) 
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40) 
    at $Proxy37.addUser(Unknown Source) 
    at com.azercell.paymentgateway.service.UserServiceImpl.addUser(UserServiceImpl.java:156) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:42) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at $Proxy38.addUser(Unknown Source) 
    at com.azercell.paymentgateway.service.UserServiceImplTest.testAddUser(UserServiceImplTest.java:101) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:242) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:240) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:48) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:233) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:303) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: java.sql.SQLException: Invalid column index 
    at oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4554) 
    at oracle.jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:4541) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setNull(OraclePreparedStatementWrapper.java:1283) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.apache.tomcat.jdbc.pool.interceptor.AbstractQueryReport$StatementProxy.invoke(AbstractQueryReport.java:235) 
    at $Proxy83.setNull(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:66) 
    at $Proxy84.setNull(Unknown Source) 
    at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:39) 
    at org.apache.ibatis.executor.parameter.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:91) 
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:77) 
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:58) 
    at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:71) 
    at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:44) 
    at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:108) 
    at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75) 
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:145) 
    at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:134) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:355) 
    ... 51 more 

만약 N 번호 {설명, 만약 javaType "에서"N "을 제거 = String, jdbcType = NVARCHAR}, "예외는 발생하지 않지만 삽입 된 문자열은 손상됩니다.

답변

1

나는 아래 매개 변수를 사용하여 Tomcat을 실행 한 후 문제를 해결할 수 있습니다

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.defaultNChar=true 

출처 : Inserting national characters into an oracle NCHAR or NVARCHAR column does not work

+0

감사합니다,이 작품! 이렇게하면 일반 JDBC가 유니 코드를 NVARCHAR 필드에 쓸 수 있습니다. 또한, Hibernate에서 같은 일을하기 위해서, Hibernate 속성 'hibernate.use_nationalized_character_data'를 참으로 설정하십시오. – Greg

0

나는 당신이 그것에있는 jdbcType를 metioning이기 때문에 당신은 XML에있는 unicode 분야의 앞에 "N"를 언급해야 할 것이라고 생각하지 않는다.

일부 환경에서는 시스템의 기본 인코딩이 XML 파일이 선호하는 유니 코드 인코딩과 잘 일치하지 않습니다. 독자로 Reader를 사용하여 iBATIS XML 파일을 구문 분석 할 때 인코딩 문제가 발생하면 XML 파일의 인코딩과 일치하도록 기본 인코딩을 변경할 수 있습니다. 예를 들어 :

String resource = “properties/sqlMap-config.xml”; 
Resources.setCharset(Charset.forName('UTF-8”)); // change the default encoding 
Reader reader = Resources.getResourceAsReader(resource); 
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMap(reader); 

모든 미래에 사용되는 인코딩을 변경 것 "setCharset"방법은 "getResourceAsReader"에 호출합니다.