2017-10-08 62 views
0

我知道这种类型的问题以前曾被问过,但我对hibernate相当陌生,而且我很难理解这种情况。所以即时通讯在Hibernate中使用这个@formula,这是类:@ManyToOne映射有什么关系呢?为什么Hibernate抛出的子查询返回多个值?

所以我有一个实体类是这样的:

@Entity 
@Table(name = "ABC") 
public class ABC{ 

    @Id 
    @Column(name ="ID") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Access(AccessType.PROPERTY) 
    private Long id; 

    @Column(name="AMOUNT") 
    private Double amount 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "R_ID") 
    @Getter 
    @Setter 
    private TXY txy; 

    @Formula((SELECT (abc.AMOUNT + (abc.AMOUNT * ISNULL(tx.RATE,0))) FROM ABC abc left join TXY tx on abc.R_ID = tx.ORIGINAL_R_ID WHERE abc.ID = ID)") 
    @Getter 
    private Double taxAmount; 


} 

该子查询返回多个值:

SELECT (abc.AMOUNT + (abc.AMOUNT * ISNULL(tx.RATE,0))) 
FROM ABC abc 
left join TXY tx on abc.R_ID = tx.ORIGINAL_R_ID 
WHERE abc.ID = ID 

我得到以下错误:

java.sql.SQLException: Subquery returned more than 1 value. This is illegal when the subquery follows =, !=, <, <= , >, >=, or when the subquery is used as an expression. 
     net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372) 
    net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988) 
    net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421) 
    net.sourceforge.jtds.jdbc.TdsCore.getNextRow(TdsCore.java:805) 
    net.sourceforge.jtds.jdbc.JtdsResultSet.next(JtdsResultSet.java:611) 
    org.apache.commons.dbcp2.DelegatingResultSet.next(DelegatingResultSet.java:191) 
    org.apache.commons.dbcp2.DelegatingResultSet.next(DelegatingResultSet.java:191) 
    net.sf.log4jdbc.sql.jdbcapi.ResultSetSpy.next(ResultSetSpy.java:1203) 
    org.hibernate.loader.Loader.processResultSet(Loader.java:950) 
    org.hibernate.loader.Loader.doQuery(Loader.java:921) 
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) 
    org.hibernate.loader.Loader.doList(Loader.java:2554) 
    org.hibernate.loader.Loader.doList(Loader.java:2540) 
    org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) 
    org.hibernate.loader.Loader.list(Loader.java:2365) 
    org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126) 
    org.hibernate.internal.SessionImpl.list(SessionImpl.java:1718) 
    org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380) 
    com.abcd.tfc.repositories.tfcRepositoryImpl.launchCriteria(tfcRepositoryImpl.java:151) 
    com.abcd.tfc.repositories.tfcRepositoryImpl.findAllWithCriteriaDecorator(tfcRepositoryImpl.java:112) 
    com.abcd.tfc.repositories.tfcRepositoryImpl.findAllWithCriteriaDecorator(tfcRepositoryImpl.java:102) 
    sun.reflect.GeneratedMethodAccessor369.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:498) 
    org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:416) 
    org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:401) 
    org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:373) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.data.repository.core.support.RepositoryFactorySupport$DefaultMethodInvokingMethodInterceptor.invoke(RepositoryFactorySupport.java:486) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) 
    com.sun.proxy.$Proxy168.findAllWithCriteriaDecorator(Unknown Source) 
    com.tfc.business.util.AbstractBusinessBO.findAllWithCriteriaDecorator(AbstractBusinessBO.java:268) 
    com.tfc.business.util.AbstractBusinessBO$$FastClassBySpringCGLIB$$be9ea55d.invoke(<generated>) 
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    com.tfc.business.bo.InvoiceBusiness$$EnhancerBySpringCGLIB$$ef1e7ae1.findAllWithCriteriaDecorator(<generated>) 
    com.tfc.business.util.AbstractBusinessBO$$FastClassBySpringCGLIB$$be9ea55d.invoke(<generated>) 
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    com.tfc.business.bo.InvoiceBusiness$$EnhancerBySpringCGLIB$$f6253b14.findAllWithCriteriaDecorator(<generated>) 
    com.tfc.business.bo.RecentlyViewedBusiness.findAllRecentlyViewed(RecentlyViewedBusiness.java:522) 
    com.tfc.business.bo.RecentlyViewedBusiness.getRecentlyViewed(RecentlyViewedBusiness.java:124) 
    com.tfc.business.bo.RecentlyViewedBusiness$$FastClassBySpringCGLIB$$f19d458f.invoke(<generated>) 
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    com.tfc.business.bo.RecentlyViewedBusiness$$EnhancerBySpringCGLIB$$20d96d2c.getRecentlyViewed(<generated>) 
    com.tfc.business.bo.RecentlyViewedBusiness$$FastClassBySpringCGLIB$$f19d458f.invoke(<generated>) 
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    com.tfc.business.bo.RecentlyViewedBusiness$$EnhancerBySpringCGLIB$$d230ffd9.getRecentlyViewed(<generated>) 
    com.tfc.web.bean.RecentlyViewedBean.getRecents(RecentlyViewedBean.java:220) 
    com.tfc.web.bean.RecentlyViewedBean.getRecents(RecentlyViewedBean.java:216) 
    com.tfc.web.bean.RecentlyViewedBean.getRecentInvoices(RecentlyViewedBean.java:702) 
    com.tfc.web.bean.RecentlyViewedBean$$FastClassBySpringCGLIB$$fa121570.invoke(<generated>) 
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) 
    org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    com.tfc.web.bean.RecentlyViewedBean$$EnhancerBySpringCGLIB$$915e83ce.getRecentInvoices(<generated>) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:498) 
    javax.el.BeanELResolver.getValue(BeanELResolver.java:94) 
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
    org.apache.el.parser.AstValue.getValue(AstValue.java:169) 
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184) 
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) 
    com.sun.faces.facelets.tag.jstl.core.ForEachHandler.apply(ForEachHandler.java:164) 
    javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:202) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:202) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:202) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:202) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:202) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:202) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:202) 

我将不胜感激任何帮助和建议。

+0

错误很明显:您的公式查询返回多个值。如果我们知道你的数据,可能会给出一个替代查询。 –

+0

@TimBiegeleisen这就是当我在一个硬编码的Id例如'在哪里​​invc.ID = 7777'运行这个查询。它只给我一个结果。 '@ ManyToOne'在这里扮演一个角色吗? – zachandcode

+0

如果即使一个查询返回2个或更多值,它也会失败。您的测试只显示它通过了某个发票,而不一定是所有发票。 –

回答

0

我并不十分熟悉休眠模式,但此查询可疑:

SELECT (abc.AMOUNT + (abc.AMOUNT * ISNULL(tx.RATE,0))) 
FROM ABC abc left join 
    TXY tx 
    on abc.R_ID = tx.ORIGINAL_R_ID 
WHERE abc.ID = ID 
---------------^ 

在大多数SQL编译器,这ID将要在查询中解决,因为abc.ID。因此,将返回abc中的所有行,而非NULLID

我将外部变量加上v_之类的东西,所以它们不会干扰其他标识符。