首页 文章

以实体作为参数的Spring Data JPA自定义查询不起作用

提问于
浏览
0

当我在Spring Data JPA中使用实体作为参数的自定义查询时,我得到了异常:

java.sql.SQLException:没有为参数1指定值

这是相关实体 . 我有两个@OneToOne关系的实体,如下所示:

汽车:

@Entity
@Table(name = "car")
public class Car {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "car_id")
private long id;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "order_id", unique = true, nullable = true, insertable = true, updatable = true)
private Order order;
...
}

订购:

@Entity
@Table(name = "order")
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id")
private long id;

@OneToOne(mappedBy="order")
private Car car;
...
}

我还有Spring Data JPA存储库,创建了自定义查询来查找Order by Car:

public interface OrderRepository extends CrudRepository<Order, Long> {

Optional<Order> findByCar(Car car);

}

但是,当我使用方法findByCar(carWithNonNullOrder)时,我收到错误:

2016年1月28日12:13:39494 [主要] WARN SqlExceptionHelper - SQL错误:0,SQLSTATE:07001 2016年1月28日12:13:39494 [主要] ERROR SqlExceptionHelper - 无为参数1 2016-01指定的值-28 12:13:39,503 [main] INFO TransactionContext - 回滚测试上下文的事务[DefaultTestContext @ 61dde151 testClass = OrderServiceIT,testInstance = com.carsystem.server.OrderServiceIT@b25b095,testMethod = shouldMakeOrder @ OrderServiceIT,testException = org.springframework .dao.InvalidDataAccessResourceUsageException:无法提取ResultSet; SQL [不适用];嵌套异常是org.hibernate.exception.SQLGrammarException:无法提取ResultSet,mergedContextConfiguration = [MergedContextConfiguration @ 507b79f7 testClass = OrderServiceIT,locations ='{classpath:context / app-context.xml}',classes ='{}',contextInitializerClasses = '[]',activeProfiles = '{}',propertySourceLocations = '{}',propertySourceProperties = '{}',的ContextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader',父= [零]]] . 2016年1月28日12:13:39504 [主要] INFO GenericApplicationContext - 关闭org.springframework.context.support.GenericApplicationContext@ff5b51f:启动日期[星期四年01月28 12点13分31秒CET 2016];上下文层次的根2016年1月28日12:13:39506 [主要] INFO tainerEntityManagerFactoryBean - 关闭JPA EntityManagerFactory的用于持久性单元“默认” org.springframework.dao.InvalidDataAccessResourceUsageException:无法提取结果集; SQL [不适用];嵌套异常是org.hibernate.exception.SQLGrammarException:无法在org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:242)中提取ResultSet (HibernateJpaDialect.java:225)在org.springframework上org.springframework.dorm.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)的org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417) . 位于org.springframework.aop.framework.ReflectiveMethodInvocation.proceed的org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)中的dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)(ReflectiveMethodInvocation.java: 179)在org.springframework.data.jpa.reposito位于org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)的org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor . )中的ry.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:131) . java:92)atg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)位于com.sun.proxy的org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) . $来自com.carsystem.server.Order上的com上的com.carsystem.server.OrderServiceImpl.listOrders(OrderServiceImpl.java:90)的com.carsystem.server.OrderMapper.map(OrderMapper.java:25)中的Proxy41.findByCar(未知来源) . 在Sun.reflect.DelegatingMe的sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)的sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)中的shouldMakeOrder(OrderServiceIT.java:96) thodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:47)org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) )在org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)在org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)在在org.springframework.test的org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)中的org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) . org.jun.R.Rerner.runner.runLeaf( ParentRunner.java:271)org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)at org .junit.runners.ParentRunner $ 3.run(ParentRunner.java:238)org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:63)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236 )org.junit.run上的org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:53)来自org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks的org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)中的ners.ParentRunner $ 2.evaluate(ParentRunner.java:229) . org.junit.runners.ParentRunner.run(ParentRunner.java:309)org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)org的.evaluate(RunAfterTestClassCallbacks.java:70) . junit.runner.JUnitCore.run(JUnitCore.java:160)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java: 212)位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)的sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)中的com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)在com.intellij.rt.execution.application.AppMain.main(AppMain.java: 140)由以下原因引起:org.hibernate.exception.SQLGrammarException:无法在org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter)的org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)中提取ResultSet .java:42)org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)at org . hagnate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79)org.hibernate.loader.Loader.getResultSet(Loader.java:2116)org.hibernate.loader.Loader.executeQueryStatement(Loader.java: 1899)org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1875)org.hibernate.loader.Loader.doQuery(Loader.java:919)atg.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java) :336)在org.hibernat的org.hibernate.loader.Loader.doList(Loader.java:2611) org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423)的e.loader.Loader.doList(Loader.java:2594)org.hibernate.loader.Loader.list(Loader.java:2418)org位于org.hibernate.engine.query.spi.HQLQueryPlan的org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)的.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)位于org.hibernate.jpa的org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)org.hibernate.internal.SessionImpl.list(SessionImpl.java:1326)的.performList(HQLQueryPlan.java:216) . org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java)中的org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483)中的internal.QueryImpl.list(QueryImpl.java:606): 50)org.springframework.data.jpository.repository.query.JpaQueryExecution $ CollectionExecution.doExecute(JpaQueryExecution.java:114)at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExe) cution.java:78)org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:100)at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java: 91)at org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:462)atorg.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:440)在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)在org.springframework.data . org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation(TransactionInterceptor.java:99)中的org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)中的projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) )在org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)在org.springframework.aop.framework.ReflectiveMethodInvocation . 在org.springframework.dao处继续(ReflectiveMethodInvocation.java:179) . 值java.sql.SQLException:support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)... 43更所致处com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)为参数1指定值com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)在com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2205)在com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2185)在com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2115 )at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1936)at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)... 74更多

看来Spring Data JPA代理找不到Car实体 . 我在这里找到了类似的问题:Spring Data query not working when query parameter is an entity,但在我的情况下,我急切地想要获取实体 . 映射或Spring Data JPA有问题吗?

EDIT

Hibernate查询:选择order0_.order_id为order_i1_3_,order0_.client_id为client_i4_3_,order0_.createdDate为createdD2_3_,order0_.returnDate作为returnDa3_3_从订单order0_左外上order0_.order_id = car1_.order_id其中car1_.car_id =加入汽车car1_?

我注意到我在自定义查询中使用的参数Car也是Order实体的类成员 . 但是,当我调用查询时,Car和Order之间存在循环依赖关系:Order有一个null Car .

2 回答

  • 0

    试试这个:

    Order findOneByCar(Car car);
    
  • 0
    public interface OrderRepository extends JpaRepository<Order, Long> {
    
    Order findByCar(Car car);
    
    }
    

    这应该工作 .

相关问题