8
respostas

java.lang.ArrayIndexOutOfBoundsException na linha List<Movimentacao> resultados = query.getResultList();

Estou implementando os exemplos da aula 06 e o erro Acima ocorre ao carrregar a lista com as movimentações.

Quando eu codifico o Eclipse retorna "Type safety: The expression of type List needs unchecked conversion to conform to List"

Segue a classe inteira:

package teste;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import modelo.Movimentacao;
import util.JPAUtil;

public class TesteJPQL {

    public static void main(String[] args) {
        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();
        String jpql = "Select m from Movimentacao m where m.conta.id = 1";
        Query query = em.createQuery(jpql);        

        List<Movimentacao> resultados = query.getResultList();

        resultados.forEach(movimento -> System.out.println(movimento));            
    }
}
8 respostas

Fala João, tudo bem?

Essa mensagem de warning ocorre porque o método getResultList() returna uma List (de tipo não especificado), e você está atribuindo este retorno à uma List de Movimentacao. Ou seja, é uma conversão não verificada pelo compilador.

Você pode seguramente colocar um @SupressWarnings("unchecked")

Abraço!

@SupressWarnings("unchecked") resolve o problema do alerta, mas não resolve o erro java.lang.ArrayIndexOutOfBoundsException na linha List resultados = query.getResultList(); que ocorre no momento em que a lista é carregada.

João,

Por gentileza, veja se tem alguma conta com id = 1 na sua tabela Movimentação, segue comando SQL:

select * from Movimentacao where conta_id = 1;

Realizei o teste e o erro continua. Aliás, o erro ocorre quando a query encontra pelo menos um registro, e não quando retorna vazio.

Segue o código com a linha do erro destacada:

public static void main(String[] args) {

    EntityManager em = new JPAUtil().getEntityManager();
    em.getTransaction().begin();

    String jpql = "select m from Movimentacao m where m.conta.id = 99";
    Query query = em.createQuery(jpql);
    /*
    Existem dois registros com conta_id = 1
    Se eu tentar selecionar um registro que não existe, o erro não ocorre. 
    O erro ocorre na linha abaixo, em que eu carrego a List, e só quando a query encontra registros
    */  
    @SuppressWarnings("unchecked")
    List<Movimentacao> resultados = (List<Movimentacao>)query.getResultList(); // erro nesta linha

    resultados.forEach(movimento -> System.out.println(movimento));        

}

Minha versão do MySQL é 8.0.12 Minha versão do Java é 10.0.2 Minha versão do Hibernate é 5.2.12

Não sei se é necessário, mas segue o Persistence.xml

<!-- unidade de persistencia com o nome financas -->
<persistence-unit name="financas">

    <!-- Implementação do JPA, no nosso caso Hibernate -->
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <!-- Aqui são listadas todas as entidades -->
    <class>modelo.Conta</class>
    <class>modelo.Movinentacao</class>
    <class>modelo.Categoria</class>
    <class>modelo.Cliente</class>        

    <properties>    
        <!-- Propriedades JDBC -->
        <property name="javax.persistence.jdbc.driver" 
            value="com.mysql.jdbc.Driver" />

        <property name="javax.persistence.jdbc.url" 
            value="jdbc:mysql://localhost/financas" />

        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="senha" />

        <!-- Configurações específicas do Hibernate -->
        <property name="hibernate.dialect" 
            value="org.hibernate.dialect.MySQL5InnoDBDialect" />

        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
    </properties>
</persistence-unit>

Tentei simular esse problema localmente, porém com o Java 8 e MySQL 5 não tive problemas.

Como você está usando o MySQL 8, tenta utilizar o dialeto abaixo no seu arquivo Persistence.xml:

org.hibernate.dialect.MySQL8Dialect

E para o pom.xml:

<!-- Hibernate dependencies -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
             <version>5.4.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
             <version>5.4.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.14</version>
        </dependency>

Veja se resolve amigo,

Abraço!

Otávio, o erro continua. Fiz a alteração no persistence.xml conforme você pediu: Quanto ao arquivo pom.xml, não encontrei este arquivo no meu projeto

Retirei a List que recebe o resultado da query só para descobrir se o erro ocorre no método getResultList() ou no momento da carga da List que receberia o resultado. O erro ocorre na execução do método getResultList().Não sei se ajuda, mas segue a log com os erros:

Hibernate: 
    select
        movimentac0_.id as id1_3_,
        movimentac0_.Data as Data2_3_,
        movimentac0_.conta_id as conta_id6_3_,
        movimentac0_.descricao as descrica3_3_,
        movimentac0_.tipoMovimentacao as tipoMovi4_3_,
        movimentac0_.valor as valor5_3_ 
    from
        Movimentacao movimentac0_ 
    where
        movimentac0_.conta_id=1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
    at org.hibernate.type.descriptor.java.EnumJavaTypeDescriptor.fromOrdinal(EnumJavaTypeDescriptor.java:76)
    at org.hibernate.type.descriptor.java.EnumJavaTypeDescriptor.wrap(EnumJavaTypeDescriptor.java:57)
    at org.hibernate.type.descriptor.java.EnumJavaTypeDescriptor.wrap(EnumJavaTypeDescriptor.java:16)
    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.metamodel.model.convert.internal.OrdinalEnumValueConverter.readValue(OrdinalEnumValueConverter.java:66)
    at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:250)
    at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:119)
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:91)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:3018)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1752)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1678)
    at org.hibernate.loader.Loader.getRow(Loader.java:1567)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:731)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:990)
    at org.hibernate.loader.Loader.doQuery(Loader.java:948)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340)
    at org.hibernate.loader.Loader.doList(Loader.java:2695)
    at org.hibernate.loader.Loader.doList(Loader.java:2678)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2512)
    at org.hibernate.loader.Loader.list(Loader.java:2507)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:504)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:396)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:224)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1511)
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1561)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1529)
    at org.hibernate.query.Query.getResultList(Query.java:168)
    at teste.TesteJPQL.main(TesteJPQL.java:28)

Fala João,

Você ajustou a configuração no persistence.xml, mas precisa atualizar as versões dos jars na pasta lib também. Para fazer o download dos JARS, você pode utilizar esse site: https://jar-download.com

Os jars e suas versões são:

  • mysql-connector-java (versão 8.0.14)
  • hibernate-entitymanager (versão 5.4.1.Final)
  • hibernate-core (5.4.1.Final)
  • hibernate-jpa-2.1-api (1.0.2.Final)

Ou se preferir, usando o MySQL 5 com JDK 8 deve resolver também.

Abraço!