JPQL Исключение параметра именованного запроса с запросами LEFT JOIN - PullRequest
1 голос
/ 30 мая 2019

Я новичок в весенних данных. У меня есть запрос LEFT Join с использованием JPQL, и я использую именованные параметры запроса для левой таблицы, но я получаю исключение "Параметр с этой позицией [1] не существует.

У меня есть 2 объекта Post и комментарии с отношением Many2One. Я хочу получить все сообщения на основе именованных параметров запроса и последнего комментария, связанного с этим сообщением. Ниже приведены сущности и JPQL

@Entity
public class Post{
  @Id
  @GeneratedValue
  private long id;
  private String authorId;
}

@Entity
public class Comment {
  @Id
  @GeneratedValue
  private long id;
  private long creationTime;
  @ManyToOne
  @JoinColumn(name="post_id")
  private Post post;
}

I have scala code for my repository:

@Repository
trait PostRepository extends PagingAndSortingRepository[Post,Long] {

  @Query("SELECT P, COM FROM Post P "
    + "LEFT JOIN FETCH  Comment COM on COM.creationTime = "
    + "(SELECT MAX(COM2.creationTime) from Comment COM2 "
    + "WHERE P.id = COM2.post_id GROUP BY COM2.post_id) "
    + "WHERE P.authorId = :authorId"
  )
  def getPosts(@Param("authorId") authorId:String) : List[Array[Object]]
}

Если я не использую именованный параметр запроса, то исключений нет, но как только я добавлю «WHERE P.authorId =: authorId», я получу исключение, связанное с именованным параметром. Я не могу понять проблему.

Если JPQL не подходит для запроса, который я хочу, не могли бы вы предложить / предоставить пример того, как я могу сделать это, используя данные пружины (возможно, спецификации?). Я новичок в этом, и поэтому любой пример кода с благодарностью.

Caused by: java.lang.IllegalArgumentException: Parameter with that position [1] did not exist

            at org.hibernate.jpa.spi.BaseQueryImpl.findParameterRegistration(BaseQueryImpl.java:502) ~[hibernate-entitymanager-5.0.12.Final.jar!/:5.0.12.Final]

            at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:692) ~[hibernate-entitymanager-5.0.12.Final.jar!/:5.0.12.Final]

            at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:181) ~[hibernate-entitymanager-5.0.12.Final.jar!/:5.0.12.Final]

            at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:32) ~[hibernate-entitymanager-5.0.12.Final.jar!/:5.0.12.Final]

            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_162]

            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_162]

            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_162]

            at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_162]

            at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:372) ~[spring-orm-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]

            at com.sun.proxy.$Proxy204.setParameter(Unknown Source) ~[na:na]

            at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:141) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.StringQueryParameterBinder.bind(StringQueryParameterBinder.java:61) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:101) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.SpelExpressionStringQueryParameterBinder.bind(SpelExpressionStringQueryParameterBinder.java:76) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:161) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:152) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.doCreateQuery(AbstractStringBasedJpaQuery.java:81) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.java:190) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:123) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:87) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106) ~[spring-data-jpa-1.11.10.RELEASE.jar!/:na]

            at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:492) ~[spring-data-commons-1.13.10.RELEASE.jar!/:na]

            at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:475) ~[spring-data-commons-1.13.10.RELEASE.jar!/:na]

            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]

            at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56) ~[spring-data-commons-1.13.10.RELEASE.jar!/:na]

            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]

            at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]

            at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) ~[spring-tx-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]

            at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]

            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]

            at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]

            ... 152 common frames omitted

1 Ответ

0 голосов
/ 31 мая 2019

Вы можете установить спящий режим генерации уровня журнала запросов на FINEST и посмотреть сгенерированный SQL. Я думаю, что есть проблема в создаваемом sql.
Я запустил код в моем проекте и запрос на вывод выглядит так:

select id, authorId, creationTime from post // creationTime comes from comment but is still generated as belonging to post

Может быть, это может помочь вам Hibernate показать реальный SQL .

Проблема в том, что вы хотите получить 2 объекта в качестве ответа на объект, в то время как хорошим способом было бы получить tuple / mapEntry или что-то подобное.

SELECT new java.util.AbstractMap.SimpleEntry(post, comment ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...