org.hibernate.hql.internal.ast.QuerySyntaxException: la tabla no está mapeada


98

Tengo la aplicación web de ejemplo Hibernate 4.3.5 + Base de datos Derby 10.10.1.1+ Glassfish4.0 con IDE NetBeans 8.0Beta.

Tengo la siguiente excepción:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: CUSTOMERV is not mapped
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189)
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109)
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:331)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3633)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3522)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
... 72 more 

Formulario de index.xhtml

<h:panelGrid id="panel1" columns="2" border="1"
                 cellpadding="5" cellspacing="1">
        <f:facet name="header">
            <h:outputText value="Add Customer Information"/>
        </f:facet>
        <h:outputLabel value="First Name:"/>
        <h:inputText value="#{customer.firstName}" id="fn"/>
        <h:outputLabel value="Last Name:"/>
        <h:inputText value="#{customer.lastName}" id="ln"/>
        <h:outputLabel value="Email:"/>
        <h:inputText value="#{customer.email}" id="eml"/>
        <h:outputLabel value="Date of Birth:"/>
        <h:inputText value="#{customer.sd}" id="s"/>
        <f:facet name="footer">
            <h:outputLabel value="#{customer.msg}" id="msg" styleClass="msg"/>
            <h:commandButton value="Save" action="#{customer.saveCustomer}">
            </h:commandButton>
        </f:facet>
    </h:panelGrid> 

Customer.java

    package com.javaknowledge.entity;

    import com.javaknowledge.dao.CustomerDao;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import javax.persistence.*;    

    @ManagedBean
    @SessionScoped

    public class Customer implements java.io.Serializable {

    private Integer custId;
    private String firstName;
    private String lastName;
    private String email;
    private Date dob;
    private String sd, msg, selectedname;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");


    public Customer() {
    }

    public Customer(String firstName, String lastName, String email, Date dob) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.dob = dob;
    }

    public String getSd() {
        return sd;
    }

    public void setSd(String sd) {
        this.sd = sd;
    }

    public Integer getCustId() {
        return this.custId;
    }

    public void setCustId(Integer custId) {
        this.custId = custId;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    @Column(name = "EMAIL")
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column(name = "DOB")
    public Date getDob() {
        return this.dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getSelectedname() {
        return selectedname;
    }

    public void setSelectedname(String selectedname) {
        this.selectedname = selectedname;
    }

    public void saveCustomer() {
        try {
            Date d = sdf.parse(sd);
            System.out.println(d);
            this.dob = d;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        CustomerDao dao = new CustomerDao();
        dao.addCustomer(this);
        this.msg = "Member Info Saved Successfull!";
        clearAll();
    }
    public void updateCustomer() {
        try {
            Date d = sdf.parse(sd);
            System.out.println(d);
            this.dob = d;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        CustomerDao dao = new CustomerDao();
        dao.updateCustomer(this);
        this.msg = "Member Info Update Successfull!";
        clearAll();
    }
    public void deleteCustomer() {
        CustomerDao dao = new CustomerDao();
        dao.deleteCustomer(custId);
        this.msg = "Member Info Delete Successfull!";
        clearAll();
    }

    public List<Customer> getAllCustomers() {
        List<Customer> users = new ArrayList<Customer>();
        CustomerDao dao = new CustomerDao();
        users = dao.getAllCustomers();
        return users;
    }

    public void fullInfo() {
        CustomerDao dao = new CustomerDao();
        List<Customer> lc = dao.getCustomerById(selectedname);
        System.out.println(lc.get(0).firstName);
        this.custId = lc.get(0).custId;
        this.firstName = lc.get(0).firstName;
        this.lastName = lc.get(0).lastName;
        this.email = lc.get(0).email;
        this.dob = lc.get(0).dob;
        this.sd = sdf.format(dob);
    }

    private void clearAll() {
        this.firstName = "";
        this.lastName = "";
        this.sd = "";
        this.email = "";
        this.custId=0;
    }

   }

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property>
    <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
    <property name="hibernate.connection.url">jdbc:derby://localhost:1527/derbyDB</property>
    <property name="hibernate.connection.username">user1</property>
    <property name="hibernate.connection.password">user1</property>
    <property name="hibernate.hbm2ddl.auto">create</property>

    <property name="c3p0.min_size">1</property>
    <property name="c3p0.max_size">5</property>
    <property name="c3p0.timeout">300</property>
    <property name="c3p0.max_statements">50</property>
    <property name="c3p0.idle_test_period">300</property>

    <mapping class="com.javaknowledge.entity.Customer" resource="com/javaknowledge/entity/Customer.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="com.javaknowledge.entity.Customer" table="CUSTOMERV" schema="APP">
        <id name="custId" type="java.lang.Integer">
            <column name="cust_id" />
            <generator class="increment" />
        </id>
        <property name="firstName" type="string">
            <column name="first_name" length="45" not-null="true" />
        </property>
        <property name="lastName" type="string">
            <column name="last_name" length="45" not-null="true" />
        </property>
        <property name="email" type="string">
            <column name="email" length="45" not-null="true" />
        </property>
        <property name="dob" type="date">
            <column name="dob" length="10" not-null="true" />
        </property>
   </class>
</hibernate-mapping>

Respuestas:


122

¡Finalmente encontré un error! Espero que sea útil para alguien. Al hacer una solicitud a la base de datos (en mi caso Apache Derby), el nombre de la base debe escribir la primera letra en mayúscula y otra en minúscula.

Esta es una consulta incorrecta:

session.createQuery("select first_name from CUSTOMERV").

Esta es una consulta válida

session.createQuery("select first_name from Customerv"). 

Y la entidad de clase debe tener el mismo nombre que la base de datos, pero no estoy seguro.


44
Puede que esa no sea la razón. Seleccione c de Cliente c, esta es una buena consulta ya que Cliente es su nombre de clase y deberíamos escribir el nombre de la clase en la consulta, no el nombre de la tabla. estaría bien. Por favor verifique con eso.
Shoaib Chikate

¡Gracias por el consejo Shoalib Chikate!
Vlad Dobrydin


4
Genial, lo único que funcionó para mí fue usar el nombre de la clase bien formateado en lugar del nombre de la tabla de la base de datos en sí. Creo que Hibernate requiere esto para poder hacer un mapeo adecuado. Sin embargo, es un poco confuso y no de la forma habitual como con JDBC, pero espero que las versiones futuras intenten agradar este problema. Sería una ventaja mantener algo de estilo de JDBC para algunos de estos mecanismos de consulta.
Akah

2
Gracias. Funcionó para mí. En realidad, toma el nombre de la entidad / clase, no el de la tabla. Por ejemplo: si el nombre de su tabla es CLIENTE y el nombre de su entidad es Cliente, tomará Cliente en la consulta, ya que es una consulta HQL.
Terry

50

en la consulta HQL , no escriba el nombre de la tabla , escriba el nombre de su clase de entidad en su consulta como

String s = "from Entity_class name";
query qry = session.createUqery(s);

Salvaste mi tiempo y mi vida (*> *)
Ved Prakash

19

En mi caso me olvidé de agregar nativeQuery = true

@Query( value = "some sql query ...", nativeQuery = true)

Para Spring Boot con Spring Data JPA


1
¡Gracias! Lo mismo sucedió conmigo ahora :)
essayoub

12

El archivo hibernate.cfg.xml debe tener el mapeo de las tablas como se muestra a continuación. Compruebe si falta en su archivo.

......
<hibernate-configuration>
......
......
  <session-factory>
......
<mapping class="com.test.bean.dbBean.testTableHibernate"/>
......
 </session-factory>

</hibernate-configuration>
.....

1
este fue el caso para mí, mientras cambiaba la implementación para trabajar con Oracle DB en lugar de Derby, con Derby, por alguna razón, declarar entidades en persistence.xml no era necesario (me parecía lógico, ya que las entidades ya estaban anotadas) (tal vez eso se debió a un controlador más antiguo (ojdbc6))
hello_earth

10

Si está utilizando las anotaciones JPA para crear las entidades y luego asegúrese de que el nombre de la tabla esté mapeado junto con la anotación @Table en lugar de @Entity.

Mapeado incorrectamente:

@Entity(name="DB_TABLE_NAME")
public class DbTableName implements Serializable {
   ....
   ....
}

Entidad mapeada correctamente:

@Entity
@Table(name="DB_TABLE_NAME")
public class DbTableName implements Serializable {
   ....
   ....
}

3
¡Gracias! Esa fue exactamente mi versión de este problema.
Martin McCallion

1
Gracias Muy útil. Seguir ayudando a los demás
mukesh krishnan

4

Puede que esto lo deje más claro y, por supuesto, también tenga sentido.

@Entity
@Table(name = "users")

/**
 * 
 * @author Ram Srinvasan
 * Use class name in NamedQuery
 * Use table name in NamedNativeQuery
 */
@NamedQueries({ @NamedQuery(name = "findUserByName", query = "from User u where u.name= :name") })

@NamedNativeQueries({ @NamedNativeQuery(name = "findUserByNameNativeSQL", query = "select * from users u where u.name= :name", resultClass = User.class) })
public class User implements Principal {
...
}

3

Hay una oportunidad más de obtener esta excepción incluso si usamos el nombre de la clase, es decir, si tenemos dos clases con el mismo nombre en diferentes paquetes. obtendremos este problema.

Creo que hibernate puede generar ambigüedad y lanzar esta excepción, por lo que la solución es usar un nombre calificado completo (como com.test.Customerv )

Agregué esta respuesta que ayudará en el escenario como mencioné. Tengo el mismo escenario atascado durante algún tiempo.


3

Ninguna otra solución funcionó para mí.

Incluso si no creo que sea la mejor práctica, tuve que agregarlo al código de esta manera

configuration.addAnnotatedClass(com.myOrg.entities.Person.class);

aquí

public static SessionFactory getSessionFactory() {
    Configuration configuration = new Configuration().configure();

    configuration.addAnnotatedClass(com.myOrg.entities.Person.class);

    StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
            .applySettings(configuration.getProperties());
    SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());
    return sessionFactory;
}

3

Yo también me he enfrentado a un problema similar cuando comencé a trabajar en Hibernate. En general, puedo decir que en createQuery se debe pasar el nombre de la clase de entidad, no el nombre de la tabla a la que se asigna la entidad.


2

Significa que su tabla no está asignada al JPA. O el nombre de la tabla es incorrecto (tal vez distingue entre mayúsculas y minúsculas) o debe poner una entrada en el archivo XML.

Codificación feliz :)


en que archivo xml?
Subrahmanyam Janapamula

2

Otras personas que estén usando clases de mapeo para Hibernate, asegúrese de que se hayan dirigido correctamente a paquete modelo en la sessionFactorydeclaración del bean en la siguiente parte:

<property name="packagesToScan" value="com.mblog.model"></property>

Tuve este problema con micronaut cuando olvidé cambiar packages-to-scanmi application.ymlarchivo de configuración.
Ibrahim.H

1

Si por casualidad usa Java para la configuración, es posible que deba verificar la siguiente beandeclaración si tiene cambios en el nivel del paquete. Por ejemplo: com.abc.springpaquete cambiado acom.bbc.spring

@Bean
    public SessionFactory sessionFactory() {

        LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource());
        //builder.scanPackages("com.abc.spring");    //Comment this line as this package no longer valid.
        builder.scanPackages("com.bbc.spring");
        builder.addProperties(getHibernationProperties());

        return builder.buildSessionFactory();
    }

1

En mi caso: spring boot 2, fuente de datos múltiple (predeterminada y personalizada). entityManager.createQuerysalir mal: 'la entidad no está asignada'

durante la depuración, descubro que el unitName del entityManager es incorrecto (debería ser personalizado, pero el hecho es predeterminado) de la manera correcta:

@PersistenceContext(unitName = "customer1") // !important, 
private EntityManager em;

el customer1es de la segunda clase de origen de datos de configuración:

@Bean(name = "customer1EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
        @Qualifier("customer1DataSource") DataSource dataSource) {
    return builder.dataSource(dataSource).packages("com.xxx.customer1Datasource.model")
            .persistenceUnit("customer1")
            // PersistenceUnit injects an EntityManagerFactory, and PersistenceContext
            // injects an EntityManager.
            // It's generally better to use PersistenceContext unless you really need to
            // manage the EntityManager lifecycle manually.
            // 【4】
            .properties(jpaProperties.getHibernateProperties(new HibernateSettings())).build();
}

Entonces, el entityManager tiene razón.

Pero, em.persist (entidad) no funciona y la transacción no funciona.

Otro punto importante es:

@Transactional("customer1TransactionManager") // !important
public Trade findNewestByJdpModified() {
    //test persist,working right!
    Trade t = new Trade();
    em.persist(t);
    log.info("t.id" + t.getSysTradeId());

    //test transactional, working right!
    int a = 3/0;
}

customer1TransactionManager es de la segunda clase de configuración de la fuente de datos:

@Bean(name = "customer1TransactionManager")
public PlatformTransactionManager transactionManager(
        @Qualifier("customer1EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
}

Toda la segunda clase de configuración de la fuente de datos es:

package com.lichendt.shops.sync;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "customer1EntityManagerFactory", transactionManagerRef = "customer1TransactionManager",
        // 【1】这里写的是DAO层的路径 ,如果你的DAO放在 com.xx.DAO下面,则这里写成 com.xx.DAO
        basePackages = { "com.lichendt.customer1Datasource.dao" })
public class Custom1DBConfig {

    @Autowired
    private JpaProperties jpaProperties;

    @Bean(name = "customer1DatasourceProperties")
    @Qualifier("customer1DatasourceProperties")
    @ConfigurationProperties(prefix = "customer1.datasource")
    public DataSourceProperties customer1DataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "customer1DataSource")
    @Qualifier("customer1DatasourceProperties")
    @ConfigurationProperties(prefix = "customer1.datasource") //
    // 【2】datasource配置的前缀,对应上面 【mysql的yaml配置】
    public DataSource dataSource() {
        // return DataSourceBuilder.create().build();
        return customer1DataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean(name = "customer1EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
            @Qualifier("customer1DataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.lichendt.customer1Datasource.model") // 【3】这里是实体类的包路径
                .persistenceUnit("customer1")
                // PersistenceUnit injects an EntityManagerFactory, and PersistenceContext
                // injects an EntityManager.
                // It's generally better to use PersistenceContext unless you really need to
                // manage the EntityManager lifecycle manually.
                // 【4】
                .properties(jpaProperties.getHibernateProperties(new HibernateSettings())).build();
    }

    @Bean(name = "customer1TransactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("customer1EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

muestra cómo configurar múltiples
fuentes de

0

El problema se resolvió parcialmente. Además de crear jdbc / resource (DB Derby), tenía que crear JDBC Connection Pool para el recurso db en la consola de administración de Glassfish y verificarlo al hacer ping. Ahora todas las operaciones CRUD funcionan bien. Verifico, objeto Customer en la base de datos agregando correctamente, actualizo y elimino también. Pero en el registro de salida de Glassfish tenemos la misma excepción:

SEVERE:   org.hibernate.hql.internal.ast.QuerySyntaxException: CUSTOMERV is not mapped [select concat(first_name, ' ', last_name) as name from CUSTOMERV]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234)
    .......

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: CUSTOMERV is not mapped
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189)
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109)

1
Sugerir abrir una nueva pregunta ... esta no es una respuesta a la primera pregunta ... o mejorar su primera pregunta con la palabra clave 'Actualizar'
Pipo

0

Debe usar el nombre de la clase de entidad para el método em.createQuery o debe usar el método em.createNativeQuery para la consulta nativa sin la clase de entidad

Con clase de entidad:

em.createQuery ("seleccione first_name de CUSTOMERV")

Sin clase de entidad o consulta nativa:

em.createNativeQuery ("seleccione c.first_name de CUSTOMERV c")


0

En Apache Derby DB, absténgase de usar nombres de tabla como "usuario" o así porque son palabras clave reservadas en Apache Derby pero funcionarán bien en MySql.

En la consulta, debe especificar el nombre de la clase de entidad de la que desea obtener los datos en la cláusula FROM de la consulta.

List<User> users=session.createQuery("from User").list();

Aquí, Usuario es el nombre de mi clase de Entidad Java (considere las mayúsculas y minúsculas del nombre, ya que en Java importa).


0

Otra solución que funcionó:

El objeto de acceso a datos que realmente arrojó esta excepción es

public List<Foo> findAll() {
    return sessionFactory.getCurrentSession().createQuery("from foo").list();
}

El error que cometí en el fragmento anterior es que he usado el nombre de la tabla foo dentro de createQuery. En cambio, pude usar Foo, el nombre real de la clase.

public List<Foo> findAll() {
    return sessionFactory.getCurrentSession().createQuery("from Foo").list();

Gracias a este blog: https://www.arundhaj.com/blog/querysyntaxexception-not-mapped.html


0

Otras personas que están usando clases de mapeo para Hibernate, asegúrese de que se hayan dirigido correctamente al paquete modelo en la declaración del bean sessionFactory en la siguiente parte:

public List<Book> list() {
    List<Book> list=SessionFactory.getCurrentSession().createQuery("from book").list();
    return list;
}

El error que cometí en el fragmento anterior es que he usado el nombre de la tabla foo dentro de createQuery. En cambio, pude usar Foo, el nombre real de la clase.

public List<Book> list() {                                                                               
    List<Book> list=SessionFactory.getCurrentSession().createQuery("from Book").list();
    return list;
}

0

agregar parámetro nativeQuery = true

ej .: @Query (valor = "Actualizar el conjunto de usuarios nombre_usuario =: nombre_usuario, contraseña =: contraseña donde id_usuario =: id_usuario", nativeQuery = true)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.