【问题标题】:Convert SQL native query to Spring data JPA将 SQL 原生查询转换为 Spring 数据 JPA
【发布时间】:2017-10-24 11:00:38
【问题描述】:

我正在尝试将 MySQL 本机查询转换为 Spring 数据 JPA 查询。

@Query(value = "FROM PD p where p.pT = :pT AND p.fY = :fY "
            + " AND p.Ew.eId in (SELECT ew.eId FROM Ew ew WHERE ew.o.oId in ( :oId ) )")
    List<PD> test(@Param("pT")String pT,@Param("year") Integer year,@Param("oId")String oId);

我遇到异常

Caused by: java.lang.IllegalArgumentException: Parameter value [265,295,296] did not match expected type [java.lang.Integer (n/a)]
at org.hibernate.jpa.spi.BaseQueryImpl.validateBinding(BaseQueryImpl.java:892)
at org.hibernate.jpa.internal.QueryImpl.access$000(QueryImpl.java:61)
at org.hibernate.jpa.internal.QueryImpl$ParameterRegistrationImpl.bindValue(QueryImpl.java:234)
at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:637)
at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:163)
at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:32)
at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:150)
at org.springframework.data.jpa.repository.query.StringQueryParameterBinder.bind(StringQueryParameterBinder.java:61)
at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:111)
at org.springframework.data.jpa.repository.query.SpelExpressionStringQueryParameterBinder.bind(SpelExpressionStringQueryParameterBinder.java:69)
at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:172)
at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:163)
at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.doCreateQuery(AbstractStringBasedJpaQuery.java:78)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.java:169)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:114)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78)
at 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)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:440)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
... 85 more

应感谢任何帮助!

【问题讨论】:

  • 您输入了“nativeQuery=true” ... 所以它需要 SQL,但您没有提供 SQL。 FWIW JPQL 以“SELECT {alias}”开头,否则您将自己委托给特定的提供商而没有任何好处(即愚蠢的决定)
  • @DN1 哦,是的,我需要从 HQL 中删除 native query = true .. 让我试试。谢谢
  • @DN1 我编辑了我的问题。
  • @DN1 现在知道了,我需要传递数组而不是逗号分隔的字符串

标签: java mysql spring hibernate spring-data-jpa


【解决方案1】:

这是有效的!

我需要传递 id 的数组列表而不是逗号分隔的字符串

 @Param("oId")List<Integer> oId

【讨论】:

    猜你喜欢
    • 2020-01-11
    • 2021-11-02
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2021-06-27
    相关资源
    最近更新 更多