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>
java
hibernate
derby
glassfish-4
Vlad Dobrydin
fuente
fuente
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);
fuente
En mi caso me olvidé de agregar
nativeQuery = true
@Query( value = "some sql query ...", nativeQuery = true)
Para Spring Boot con Spring Data JPA
fuente
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> .....
fuente
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 { .... .... }
fuente
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 { ... }
fuente
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.
fuente
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; }
fuente
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.
fuente
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 :)
fuente
Otras personas que estén usando clases de mapeo para Hibernate, asegúrese de que se hayan dirigido correctamente a paquete modelo en la
sessionFactory
declaración del bean en la siguiente parte:<property name="packagesToScan" value="com.mblog.model"></property>
fuente
packages-to-scan
miapplication.yml
archivo de configuración.Si por casualidad usa Java para la configuración, es posible que deba verificar la siguiente
bean
declaración si tiene cambios en el nivel del paquete. Por ejemplo:com.abc.spring
paquete 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(); }
fuente
En mi caso: spring boot 2, fuente de datos múltiple (predeterminada y personalizada).
entityManager.createQuery
salir 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
customer1
es 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); } }
fuente
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)
fuente
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")
fuente
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).
fuente
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
fuente
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; }
fuente
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)
fuente