2017-08-31 109 views
0

當通過Spring JPA在C​​lientAccount和ProductDescription之間進行JOIN時發生隱式轉換錯誤。我不確定轉換髮生在哪裏。我正在使用Sybase。Spring JPA SQLException:從數據類型INTO到CHAR的隱式轉換

錯誤:

Hibernate: select productdes0_.ProductID as ProductID1_2_0_, productdes0_.LanguageID as LanguageID3_2_0_, productdes0_.CountryID as CountryID2_2_0_, productdes0_.LengthID as LengthID4_2_0_, productdes0_.ProductID as ProductID1_2_1_, productdes0_.CountryID as CountryID2_2_1_, productdes0_.LanguageID as LanguageID3_2_1_, productdes0_.LengthID as LengthID4_2_1_, productdes0_.Description as Description5_2_1_ from ProductDescription productdes0_ where productdes0_.ProductID=? and productdes0_.LanguageID=? and productdes0_.CountryID=? and productdes0_.LengthID=? 
18:23:28.005 [http-nio-8080-exec-1] DEBUG org.hibernate.engine.jdbc.spi.SqlExceptionHelper - could not extract ResultSet [n/a] 
java.sql.SQLException: Implicit conversion from datatype 'INT' to 'CHAR' is not allowed. Use the CONVERT function to run this query. 

    at com.sybase.jdbc4.jdbc.SybConnection.getAllExceptions(Unknown Source) ~[jconn4-7.0.jar:?] 
    at com.sybase.jdbc4.jdbc.SybStatement.handleSQLE(Unknown Source) ~[jconn4-7.0.jar:?] 
    at com.sybase.jdbc4.jdbc.SybStatement.nextResult(Unknown Source) ~[jconn4-7.0.jar:?] 
    at com.sybase.jdbc4.jdbc.SybStatement.nextResult(Unknown Source) ~[jconn4-7.0.jar:?] 
    at com.sybase.jdbc4.jdbc.SybStatement.queryLoop(Unknown Source) ~[jconn4-7.0.jar:?] 
    at com.sybase.jdbc4.jdbc.SybStatement.executeQuery(Unknown Source) ~[jconn4-7.0.jar:?] 
    at com.sybase.jdbc4.jdbc.SybPreparedStatement.executeQuery(Unknown Source) ~[jconn4-7.0.jar:?] 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:434) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:186) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:121) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:88) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:688) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:75) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1991) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:570) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:252) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:566) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:135) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.collection.internal.PersistentBag.toArray(PersistentBag.java:283) [hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at com.bns.baas.deposit.account.account.query.DepositAccountService.getDepositAccountByKey(DepositAccountService.java:74) [main/:?] 
    at com.bns.baas.deposit.account.account.query.DepositAccountService$$FastClassBySpringCGLIB$$f2f69165.invoke(<generated>) [main/:?] 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) [spring-core-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) [spring-tx-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) [spring-tx-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) [spring-tx-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at com.bns.baas.deposit.account.account.query.DepositAccountService$$EnhancerBySpringCGLIB$$430deac8.getDepositAccountByKey(<generated>) [main/:?] 
    at com.bns.baas.deposit.account.account.query.DepositAccountController.account(DepositAccountController.java:67) [main/:?] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_141] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_141] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_141] 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55) [spring-boot-1.5.4.RELEASE.jar:1.5.4.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110) [spring-boot-actuator-1.5.4.RELEASE.jar:1.5.4.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106) [spring-boot-actuator-1.5.4.RELEASE.jar:1.5.4.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_141] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_141] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.15.jar:8.5.15] 
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_141] 

ClientAccount.java

@Table(name="ClientAccount") 
@Entity 
@Getter 
@Setter 
public class ClientAccount { 

    @EmbeddedId 
    private ClientAccountKey key; 

    @OneToMany (fetch = FetchType.LAZY) 
    @JoinColumns({ 
     @JoinColumn(name="ProductID", insertable = false, updatable = false), 
     @JoinColumn(name="LanguageID", insertable = false, updatable = false), 
     @JoinColumn(name="CountryID", insertable = false, updatable = false), 
     @JoinColumn(name="LengthID", insertable = false, updatable = false) 
    }) 
    private List<ProductDescription> productDescription; 

} 

ProductDescription.java

@Table(name="ProductDescription") 
@Entity 
@Getter 
@Setter 
public class ProductDescription { 
    @EmbeddedId 
    private ProductDescriptionKey key; 

    @Column(name = "Description", insertable = false, updatable = false) 
    private String description; 

    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name="ProductID", insertable = false, updatable = false), 
     @JoinColumn(name="LanguageID", insertable = false, updatable = false), 
     @JoinColumn(name="CountryID", insertable = false, updatable = false), 
     @JoinColumn(name="LengthID", insertable = false, updatable = false) 
    }) 
    private ClientAccount clientAccount; 
} 

ProductDescriptionKey.java

@Setter 
@Getter 
@EqualsAndHashCode 
@Embeddable 
public class ProductDescriptionKey implements Serializable { 

    @Column(name = "ProductID", insertable = false, updatable = false) 
    private String ProductID; 

    @Column(name = "LanguageID", insertable = false, updatable = false) 
    private String languageID; 

    @Column(name = "CountryID", insertable = false, updatable = false) 
    private String countryID; 

    @Column(name = "LengthID", insertable = false, updatable = false) 
    private String lengthID; 
} 

ProductDescription SQL Table Schema

ProductDescription SQL Table primary key

誰能幫助確定我可能是錯的?

+0

您的主鍵定義在哪裏?據我所知,您需要在JPA – mrkernelpanic

+0

中至少定義一個我在原始文章中添加了主鍵的快照。 – user3712237

+1

爲什麼到處使用'insertable = false,updatable = false'?請添加完整的異常堆棧?其次,關係'ProductDescription'''ClientAccount'應該擁有關聯關係之一,我建議你使用@OneToMany和'mappedby'(兩邊都不需要@JoinColumn),你可以寫'@OneToMany(fetch = FetchType.LAZY,mappedBy =「clientAccount」)' –

回答

0

在您的ProductDescriptionkey類中將字符串中的productId類型更改爲Integer或Long,因爲這代表您的主鍵。

+0

我剛試過,它給了我同樣的錯誤。我在原始文章中添加了堆棧跟蹤。有沒有辦法在ProductDescriptionKey中添加轉換爲屬性? – user3712237

0

我無法從異常多的信息,但我會努力糾正一些映射問題,它可能會導致異常

首先:ClientAccount.java應該是(因爲你使用雙向關聯) :

@Table(name="ClientAccount") 
@Entity 
@Getter 
@Setter 
public class ClientAccount { 

    @EmbeddedId 
    private ClientAccountKey key; 

    @OneToMany (fetch = FetchType.LAZY, mappedBy = "clientAccount") 
    private List<ProductDescription> productDescription;  
} 

ProductDescriptionKey.java

Table(name="ProductDescription") 
@Entity 
@Getter 
@Setter 
public class ProductDescription { 

    @EmbeddedId 
    private ProductDescriptionKey key; 

    @Column(name = "Description", insertable = false, updatable = false) 
    private String description; 

    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name="ClientAccountKeyField1_Fk_ColumnName", referencedColumnName = "ClientAccountKeyField1_Pk_ColumnName"), 
     @JoinColumn(name="ClientAccountKeyField2_Fk_ColumnName", referencedColumnName = "ClientAccountKeyField2_Pk_ColumnName"), 
//... other @JoinColumn 
    }) 
    private ClientAccount clientAccount; 
} 

你可能注意到了,在@JoinColumn您應該使用ClientAccountKey字段,而不是ProductDescriptionKey,因爲這些列將在ProductDescription中創建,以引用ClientAccount行。

...,並使用@JoinColumns時,您應該使用referencedColumnName,如文檔中表示:

When the JoinColumns annotation is used, both the name and the referencedColumnName elements must be specified in each such JoinColumn annotation

: 我不認爲這是ProductDescriptionKey類使用insertable = false, updatable = false一個好主意,因爲你應該有一個ID要堅持。但是,如果您想要只讀實體,請改用@Immutabl

希望它解決了這個問題!

相關問題