2017-08-31 104 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

希望它解决了这个问题!

相关问题