JAVA @Query пытается найти несуществующую таблицу в соответствии с именем класса Entity - PullRequest
0 голосов
/ 20 января 2020

У меня есть зависимая служба, единственная цель которой - время от времени запрашивать несколько таблиц нескольких типов клиентов (отклоненных, ожидающих и т. Д. c) и создавать из них потенциальных клиентов для отправки нашим ведет систему. Поскольку мне не нужны точные сущности клиента, только несколько деталей, которые можно найти во всех таблицах (они по своей сути отличаются только несколькими общими записями для идентификации клиента), я создал сущность, которая не должна быть привязана к одному Таблица - но хранит результаты для всех моих запросов:

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import javax.persistence.Entity;
import javax.persistence.Id;

@Getter
@Setter
@NoArgsConstructor
@ToString
@Entity
public class LeadEntity {

    @Id
    private Long id;

    private String firstName;
    private String lastName;
    private String mobile;
    private String email;
    private String notes;
}

Кроме того, я создал репозиторий с 4 запросами к 4 таблицам, который выглядит примерно так:

@Repository
public interface LeadsRepository extends JpaRepository<LeadEntity, Long> {
@Query(value =
        "select " +
                "    rc.id, " +
                "    rc.firstName as first_name, " +
                "    rc.lastName as last_name, " +
                "    rc.phoneNumber as mobile, " +
                "    rc.email as email, " +
                "    null as notes, " +
                "    null as age_of_youngest_driver, " +
                "    null as insurance_type, " +
                "    null as manufacturer, " +
                "    null as model, " +
                "    null as year, " +
                "    null as claims, " +
                "    null as experience, " +
                "    null as license_revocations, " +
                "    null as insurance_start_date, " +
                "    null as vehicle_type, " +
                "    null as policy_number " +
                "from " +
                "    rejected_customers rc " +
                "where " +
                "    rc.creationDate > ?1 and rc.creationDate < ?2 " +
                "    and rc.phoneNumber is not null", nativeQuery = true)
List<LeadEntity> findRejectedCustomers(Date begin, Date end);

}

Немногие что нужно отметить в отношении объявления этого репозитория:

  1. здесь вы видите только один метод запроса, у меня 4, которые выглядят одинаково, но из разных таблиц и разных столбцов.

  2. синтаксис «null as X» здесь по историческим причинам (означает, что программист до меня написал это, и я не хочу ничего портить, потому что я новичок в этой работе, поэтому я следую той же схеме XD).

  3. ВСЕ запросы имеют "nativeQuery = true", поэтому они должны выполняться точно так, как написано, насколько я понимаю. Кроме того, каждый запрос ссылается на отдельную таблицу (некоторые также получают "join" внутри).

Часть кода, выполняющая их, находится внутри планировщика и так проста:

        leadsRepository.findRejectedCustomers(beginOfTimePeriod, endOfTimePeriod)
                .forEach(this::createLead);

        leadsRepository.findPendingPackages(beginOfTimePeriod, endOfTimePeriod)
                .forEach(this::createLead);

        leadsRepository.findIncompleteOffers(beginOfTimePeriod, endOfTimePeriod)
                .forEach(this::createLead);

        leadsRepository.findNoClaimsPackages(beginOfTimePeriod, endOfTimePeriod)
                .forEach(this::createLead);

И вот проблема: Первый запрос после успешного запроса выдает ошибку: SQLGrammerException: таблица "lead_entry" не существует.

обратите внимание на странность Ситуация, в которой это происходит: ТОЛЬКО после того, как запрос завершится успешно и вернет результаты, следующий после него потерпит неудачу с этим исключением. Независимо от того, в каком порядке я их выполняю. Независимо от того, какой запрос работает, а какой идет после него. КАЖДАЯ комбинация, которую я пробовал, давала одинаковые результаты - эта ошибка (за исключением случая, когда no-query вернул ошибку - указывала на пустую БД, поэтому все запросы проходили чисто).

Я БЕЗУСЛЕННО !! Дадим любую информацию, которую вы, ребята, хотите .... но я не знаю, с чего начать.

HELP!

РЕДАКТИРОВАТЬ: вот трассировка стека для ошибки:

org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:279)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:253)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:138)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy74.findPendingPackages(Unknown Source)
    at com.bambidynamic.leadwize.main.scheduler.Scheduler.periodic(Scheduler.java:88)
    at com.bambidynamic.leadwize.main.scheduler.Scheduler$$FastClassBySpringCGLIB$$b155d9d1.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.bambidynamic.leadwize.main.scheduler.Scheduler$$EnhancerBySpringCGLIB$$7cb743e5.periodic(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
    at java.util.concurrent.FutureTask.run(FutureTask.java)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3358)
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3231)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3632)
    at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:146)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1453)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1439)
    at org.hibernate.query.internal.NativeQueryImpl.beforeQuery(NativeQueryImpl.java:261)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1503)
    at org.hibernate.query.Query.getResultList(Query.java:132)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:129)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:605)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke$3(RepositoryFactorySupport.java:595)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
    ... 34 more
Caused by: java.sql.SQLSyntaxErrorException: Table 'newBambi.lead_entity' doesn't exist
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:955)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1094)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1042)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1345)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1027)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)
    ... 61 more
...