[RESOLVIDO]Mapear colunas com nomes começando por número JPA Hibernate

Olá, estou com problemas para mapear as tabelas de um banco de dados onde o nome das colunas começam com número.

Aqui um exemplo de como tentei, mas sem sucesso.

@Entity
@Table(name = "A_MOT025")
public class Motorista {
    @Id
@Column(name = "[0251CODIG]", columnDefinition = "SMALLINT")
private Integer codigo;

@Column(name = "[0252NOMMO]", columnDefinition = "CHAR")
private String nome;[/code]
Tentei com assim também e não obtive sucesso.
@Entity
@Table(name = "A_MOT025")
public class Motorista {
    @Id
@Column(name = "\"0251CODIG\"", columnDefinition = "SMALLINT")
private Integer codigo;

@Column(name = "\"0252NOMMO\"", columnDefinition = "CHAR")
private String nome;

Sem fazer nenhuma consulta ele não gera erro, mas quando vou fazer essa consulta abaixo
é gerado o erro a seguir.

public static void main(String[] args) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("PedidoPU");
        EntityManager manager = factory.createEntityManager();
        EntityTransaction trx = manager.getTransaction();
        try {
            Query query = manager.createQuery("SELECT c FROM Motorista c");
            List<Motorista> resposta = query.getResultList();
            System.out.println(resposta.toString());
        } catch (RuntimeException e) {
            throw e;
        }    
        manager.close();
    }

Tenho esse erro:

2016-09-22 14:09:28,637 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] SQL Error: 6002, SQLState: 42000
2016-09-22 14:09:28,637 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] [DBMaker] syntax error near or at ".`"
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:492)
    at Teste.main(Teste.java:24)
Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1927)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1896)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1874)
    at org.hibernate.loader.Loader.doQuery(Loader.java:919)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
    at org.hibernate.loader.Loader.doList(Loader.java:2610)
    at org.hibernate.loader.Loader.doList(Loader.java:2593)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2422)
    at org.hibernate.loader.Loader.list(Loader.java:2417)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1339)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483)
    ... 1 more
Caused by: java.sql.SQLException: [DBMaker] syntax error near or at ".`"
    at dbmaker.sql.JdbcOdbcAPI.createSQLException(JdbcOdbcAPI.java:3032)
    at dbmaker.sql.JdbcOdbcAPI.checkError(JdbcOdbcAPI.java:3092)
    at dbmaker.sql.JdbcOdbcAPI.jdbcPrepare(JdbcOdbcAPI.java:677)
    at dbmaker.sql.JdbcOdbcConnection.preStatement(JdbcOdbcConnection.java:757)
    at dbmaker.sql.JdbcOdbcConnection.prepareStatement(JdbcOdbcConnection.java:350)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:146)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)

Chegou a imprimir o SQL gerado pelo hibernate?
Até pesquisei, mas não achei nada que ajudasse, nem mesmo que indicasse um caminho para esse mapeamento.

select veiculo0_.0221frota as column1_0_, veiculo0_.0221model as column2_0_ from a_vei022 veiculo0_

Usei outra classe, mas o processo é o mesmo. Esse aí é o SQL que gera.

Só por curiosidade, qual a razão pela qual as colunas são criadas com números primeiro?
Bom, o SQL que você mostrou não é relativo a nenhuma das classes que apresentou, fica difícil criar um paralelo.

Preciso fazer por ser um sistema legado.
Estou mapeando de um banco que já existe.

Segue o SQL da mesma classe:

select motorista0_.0251codig as column1_0_, motorista0_.0252nommo as column2_0_ from a_mot025 motorista0_

Se puder me ajudar…

Ok, entendo.
Eu vejo duas soluções para isso, ambas envolvem criar uma alternativa no próprio banco de dados (caso haja suporte).
1 - Criar stored procedures para todas as consultas, retornando os dados já prontos
2 - Criar views para todas as tabelas, substituindo os nomes começados em números por nomes começados em letras, por exemplo.

Humm
Essa solução se torna inviável para mim.
Teria que achar uma solução que contornasse através do mapeamento.

Mas muito obrigado pela ajuda.

E por quê inviável? Não sabe como fazer? O banco não dá suporte? Não tem acesso a criar isso no banco de dados?
Eu entendo que exista uma necessidade, porém, você precisa recordar que classes, atributos e métodos, em java, não podem ser criados com nomes iniciando em números.
Não encontrei nada falando sobre nomes válidos para colunas de tabelas no jpa, mas, creio que isso seja uma restrição.
Assim sendo, isso se torna inviável.
Talvez com native query ou com JDBC puro.

Qual motivo real de usar Hibernate, ainda mais em uma situação dessa? Você que está inserindo o problema sem necessidade.

Estou desenvolvendo um WS com Spring Boot, utilizando esses dados.

Mas, ainda assim, não precisa de hibernate.
Como eu disse, você ainda pode optar por SP, views ou usar JDBC puro.

1 curtida

Spring Boot não te obriga a usar Hibernate.

Ok, vou utilizar JDBCTemplate.

JDBCTemplate é a opção mais eficiente/leve atualmente para alimentar objetos em Java, espero que consiga.