Aurora Mysql 5.7 Недопустимая длина (4) для типа LONG

#java #mysql #spring #hibernate #amazon-aurora

Вопрос:

У меня есть приложение для весенней загрузки, использующее Hibernate и версию AWS Aurora Mysql 5.7.

У меня есть этот запрос в моем репозитории:

 @Cacheable(cacheNames = "documents#chartprofitbyday")  @Transactional(readOnly = true)  @Query("SELECT new org.javatuples.Quartet(COALESCE(SUM(d.grossProfit),0),COALESCE(CAST(AVG(d.grossMargin) as big_decimal),0),MONTH(d.date),DAY(d.date)) FROM Document d WHERE d.type IN (:types) AND d.statuslt;gt;'CANCELED' AND d.statuslt;gt;'DECLINED' AND d.store.id=:storeId AND d.dategt;=:from AND d.datelt;=:until GROUP BY MONTH(d.date),DAY(d.date) ORDER BY MONTH(d.date),DAY(d.date)")  Listlt;Quartetlt;BigDecimal, BigDecimal, Integer, Integergt;gt; chartProfitByDay(@Param("types") Listlt;DocumentTypegt; types, @Param("from") LocalDate from, @Param("until") LocalDate until, @Param("storeId") Long storeId);  

Иногда (не все время) у меня есть это исключение:

 Invalid length (4) for type LONG at com.mysql.cj.protocol.a.MysqlBinaryValueDecoder.decodeInt8(MysqlBinaryValueDecoder.java:220) at com.mysql.cj.protocol.result.AbstractResultsetRow.decodeAndCreateReturnValue(AbstractResultsetRow.java:113) at com.mysql.cj.protocol.result.AbstractResultsetRow.getValueFromBytes(AbstractResultsetRow.java:243) at com.mysql.cj.protocol.a.result.ByteArrayRow.getValue(ByteArrayRow.java:91) at com.mysql.cj.jdbc.result.ResultSetImpl.getObject(ResultSetImpl.java:1316) at com.mysql.cj.jdbc.result.ResultSetImpl.getInt(ResultSetImpl.java:822) at com.mysql.cj.jdbc.result.ResultSetImpl.getInt(ResultSetImpl.java:843) at com.zaxxer.hikari.pool.HikariProxyResultSet.getInt(HikariProxyResultSet.java) at org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$2.doExtract(IntegerTypeDescriptor.java:62) at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257) at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253) at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:243) at org.hibernate.loader.hql.QueryLoader.getResultRow(QueryLoader.java:457) at org.hibernate.loader.hql.QueryLoader.getResultColumnOrRow(QueryLoader.java:440) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:770) at org.hibernate.loader.Loader.getRowsFromResultSet(Loader.java:1039) at org.hibernate.loader.Loader.processResultSet(Loader.java:990) at org.hibernate.loader.Loader.doQuery(Loader.java:959) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349) at org.hibernate.loader.Loader.doList(Loader.java:2850) at org.hibernate.loader.Loader.doList(Loader.java:2832) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2664) at org.hibernate.loader.Loader.list(Loader.java:2659) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1414) at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1625) at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1593) at org.hibernate.query.Query.getResultList(Query.java:165) at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:126) at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88) at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:155) at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143) at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)  

Я не вижу, где в моем запросе есть длинные строки, grossProfit и grossMargin они объявлены как ДЕСЯТИЧНЫЕ(12,2) в моей БД.

У вас есть какие-либо предложения, как понять и устранить проблему?

Ответ №1:

Ваш StoreID-это тип Long.
@Param("storeId") Long storeId

 Listlt;Quartetlt;BigDecimal, BigDecimal, Integer, Integergt;gt; chartProfitByDay(@Param("types") Listlt;DocumentTypegt; types, @Param("from") LocalDate from, @Param("until") LocalDate until, @Param("storeId") Long storeId);  

Я думаю, что эта ошибка вызвана тем, что у вас storeId тип Long, и вы указали целое число.

 Listlt;Quartetlt;BigDecimal, BigDecimal, Integer, Longgt;gt;   

Комментарии:

1. Спасибо за ваш ответ. Я не думаю, что в этом проблема. Запрос возвращает МЕСЯЦ(дата),ДЕНЬ(дата) в качестве последних 2 параметров, а не идентификатор хранилища. Я уверен, что StoreID-это долго.