org.hibernate.hql.internal.ast.QuerySyntaxException: ตารางไม่ถูกแมป


98

ฉันมีตัวอย่างเว็บแอปพลิเคชัน Hibernate 4.3.5 + Derby database 10.10.1.1+ Glassfish4.0 พร้อม IDE NetBeans 8.0Beta

ฉันมีข้อยกเว้นถัดไป:

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 

แบบฟอร์มจาก 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>

คำตอบ:


122

ในที่สุดฉันก็พบความผิดพลาด! หวังว่านี่จะเป็นประโยชน์กับใครบางคน เมื่อทำการร้องขอไปยังฐานข้อมูล (ในกรณีของฉันคือ Apache Derby) ชื่อของฐานต้องเขียนตัวอักษรตัวแรกตัวพิมพ์ใหญ่อื่น ๆ ในตัวพิมพ์เล็ก

นี่เป็นคำถามที่ไม่ถูกต้อง:

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

นี่คือข้อความค้นหาที่ถูกต้อง

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

และคลาสเอนทิตีต้องเป็นชื่อเดียวกับฐานข้อมูล แต่ฉันไม่แน่ใจ


44
นั่นอาจไม่ใช่เหตุผล เลือก c จากลูกค้า c นี่เป็นแบบสอบถามที่ดีเนื่องจากลูกค้าคือชื่อคลาสของคุณและเราควรเขียนชื่อคลาสในแบบสอบถามไม่ใช่ชื่อตารางอีกสิ่งหนึ่งใน hibernate.cfg.xml ของคุณคุณได้ให้ทั้ง <ทรัพยากรการแมปและคลาส> เพียงอย่างเดียว จะดี. โปรดตรวจสอบด้วย
Shoaib Chikate

ขอบคุณสำหรับคำแนะนำ Shoalib Chikate!
Vlad Dobrydin

โปรดชี้แนะในstackoverflow.com/questions/35657292/…
Pra_A

4
เยี่ยมมากสิ่งเดียวที่ได้ผลสำหรับฉันคือการใช้ชื่อคลาสที่จัดรูปแบบได้ดีแทนที่จะเป็นชื่อตารางฐานข้อมูล ฉันคิดว่าไฮเบอร์เนตต้องการสิ่งนี้เพื่อให้สามารถทำแผนที่ได้อย่างเหมาะสม มันค่อนข้างสับสนเล็กน้อยและไม่ใช่วิธีปกติเหมือนกับ JDBC แต่ฉันหวังว่ารุ่นต่อ ๆ ไปจะพยายามแก้ไขปัญหานี้ มันจะเป็นข้อดีที่จะรักษาสไตล์จาก JDBC สำหรับกลไกการสืบค้นเหล่านี้
Akah

2
ขอบคุณ. มันได้ผลสำหรับฉัน อันที่จริงชื่อเอนทิตี / คลาสไม่ใช่ชื่อตาราง ตัวอย่างเช่นถ้าชื่อตารางของคุณคือ CUSTOMER และชื่อเอนทิตีของคุณคือลูกค้าจะใช้ลูกค้าในแบบสอบถามเนื่องจากเป็นแบบสอบถาม HQL
Terry

50

ในแบบสอบถามHQLอย่าเขียนชื่อตารางเขียนชื่อคลาสเอนทิตีของคุณในแบบสอบถามของคุณเช่น

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

คุณช่วยเวลาของฉันและชีวิตของฉัน (*> *)
Ved Prakash

19

ในกรณีของฉันฉันลืมเพิ่ม nativeQuery = true

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

สำหรับ Spring Boot พร้อม Spring Data JPA


1
ขอบคุณ! เกิดขึ้นกับฉันตอนนี้ :)
essayoub

12

ไฟล์ hibernate.cfg.xml ควรมีการแมปสำหรับตารางดังนี้ ตรวจสอบว่าไม่มีในไฟล์ของคุณ

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

</hibernate-configuration>
.....

1
นี่เป็นกรณีสำหรับฉันในขณะที่เปลี่ยนการใช้งานเพื่อทำงานกับ Oracle DB แทน Derby - ด้วย Derby ด้วยเหตุผลบางประการการประกาศเอนทิตีใน persistence.xml ไม่จำเป็น (ดูเหมือนจะมีเหตุผลสำหรับฉันเนื่องจากเอนทิตีได้รับการใส่คำอธิบายประกอบแล้ว) (อาจ นั่นเป็นเพราะไดรเวอร์รุ่นเก่า (ojdbc6))
hello_earth

10

หากคุณกำลังใช้คำอธิบายประกอบ JPA เพื่อสร้างเอนทิตีจากนั้นตรวจสอบให้แน่ใจว่าชื่อตารางถูกแมปพร้อมกับคำอธิบายประกอบ @Table แทน @Entity

แมปไม่ถูกต้อง:

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

เอนทิตีที่แมปอย่างถูกต้อง:

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

3
ขอบคุณ! นั่นคือปัญหานี้ในเวอร์ชันของฉัน
Martin McCallion

1
ขอบคุณมีประโยชน์มาก การช่วยเหลือผู้อื่น
mukesh

4

อาจจะทำให้ชัดเจนมากขึ้นและแน่นอนว่าก็สมเหตุสมผลเช่นกัน

@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

มีอีกหนึ่งโอกาสที่จะได้รับข้อยกเว้นนี้แม้ว่าเราจะใช้ชื่อคลาสเช่นถ้าเรามีสองคลาสที่มีชื่อเดียวกันในแพ็คเกจที่แตกต่างกัน เราจะได้รับปัญหานี้

ฉันคิดว่าไฮเบอร์เนตอาจมีความคลุมเครือและโยนข้อยกเว้นนี้ดังนั้นวิธีแก้ปัญหาคือใช้ชื่อที่มีคุณสมบัติครบถ้วน (เช่นcom.test.Customerv )

ฉันได้เพิ่มคำตอบนี้ซึ่งจะช่วยในสถานการณ์ดังที่ได้กล่าวไป ฉันมีสถานการณ์เดียวกันติดอยู่ในบางครั้ง


3

ไม่มีวิธีแก้ปัญหาอื่นใดที่ใช้ได้ผลสำหรับฉัน

แม้ว่าฉันจะไม่คิดว่ามันเป็นแนวทางปฏิบัติที่ดีที่สุด แต่ฉันก็ต้องเพิ่มเข้าไปในโค้ดแบบนี้

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

ที่นี่

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

ฉันก็ประสบปัญหาคล้ายกันนี้เช่นกันเมื่อฉันเริ่มทำงานกับไฮเบอร์เนต ทั้งหมดที่ฉันสามารถพูดได้คือใน createQuery หนึ่งต้องส่งชื่อของคลาสเอนทิตีไม่ใช่ชื่อตารางที่เอนทิตีถูกแมป


2

หมายความว่าตารางของคุณไม่ได้จับคู่กับ JPA ชื่อของตารางไม่ถูกต้อง (อาจพิจารณาตัวพิมพ์เล็กและใหญ่) หรือคุณต้องใส่รายการในไฟล์ XML

Happy Coding :)


ไฟล์ xml ใด
Subrahmanyam Janapamula

2

บุคคลอื่นที่ใช้คลาสการแมปสำหรับไฮเบอร์เนตตรวจสอบให้แน่ใจว่าได้ระบุที่อยู่อย่างถูกต้องเพื่อสร้างแบบจำลองแพ็กเกจในsessionFactoryการประกาศ bean ในส่วนต่อไปนี้:

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

ผมมีปัญหานี้กับ micronaut เมื่อฉันลืมที่จะเปลี่ยนpackages-to-scanฉันในapplication.ymlไฟล์ config
Ibrahim.H

1

หากคุณมีโอกาสใช้ java เพื่อกำหนดค่าคุณอาจต้องตรวจสอบการbeanประกาศด้านล่างหากคุณมีการเปลี่ยนแปลงระดับแพ็คเกจ เช่น: com.abc.springแพ็คเกจเปลี่ยนเป็นcom.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

ในกรณีของฉัน: spring boot 2 แหล่งข้อมูลหลายรายการ (ค่าเริ่มต้นและแบบกำหนดเอง) entityManager.createQueryผิดพลาด: 'ไม่ได้แมปเอนทิตี'

ในขณะที่ดีบักฉันพบว่า unitName ของ entityManager นั้นไม่ถูกต้อง (ควรเป็นแบบกำหนดเอง แต่ความจริงเป็นค่าเริ่มต้น) วิธีที่ถูกต้อง:

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

customer1จากระดับแหล่งข้อมูลการตั้งค่าที่สอง:

@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();
}

จากนั้น entityManager ถูกต้อง

แต่ em.persist (เอนทิตี) ไม่ทำงานและธุรกรรมไม่ทำงาน

จุดสำคัญอีกประการหนึ่งคือ:

@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 มาจากคลาส config แหล่งข้อมูลที่สอง:

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

คลาส config แหล่งข้อมูลที่สองทั้งหมดคือ:

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);
    }
}

แสดงวิธีการกำหนดค่าแหล่งข้อมูลหลายรายการด้วย springboot 2
hatanooh

0

ปัญหาได้รับการแก้ไขแล้วบางส่วน นอกจากการสร้าง jdbc / resource (DB Derby) แล้วยังต้องสร้าง JDBC Connection Pool สำหรับทรัพยากร db ในคอนโซลผู้ดูแลระบบ Glassfish และตรวจสอบการ pinging ตอนนี้การทำงานของ CRUD ทั้งหมดทำงานได้ดี ฉันตรวจสอบคัดค้านลูกค้าในการเพิ่มฐานข้อมูลอย่างถูกต้องอัปเดตและลบด้วย แต่ในบันทึกเอาต์พุตของ Glassfish มีข้อยกเว้นเหมือนกัน:

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
แนะนำเปิดคำถามใหม่ ... นี่ไม่ใช่คำตอบสำหรับคำถามแรก ... หรือปรับปรุงคำถามแรกของคุณด้วยคีย์เวิร์ด "อัปเดต"
Pipo

0

ควรใช้ชื่อคลาสเอนทิตีสำหรับเมธอด em.createQuery หรือควรใช้เมธอด em.createNativeQuery สำหรับเคียวรีเนทีฟที่ไม่มีคลาสเอนทิตี

ด้วยคลาสเอนทิตี:

em.createQuery ("เลือก first_name จาก CUSTOMERV")

ไม่มีคลาสเอนทิตีหรือแบบสอบถามเนทีฟ:

em.createNativeQuery ("เลือก c.first_name จาก CUSTOMERV c")


0

ใน Apache Derby DB อย่าใช้ชื่อตารางเป็น "ผู้ใช้" หรือมากกว่านั้นเนื่องจากเป็นคำหลักที่สงวนไว้ใน Apache Derby แต่จะทำงานได้ดีบน MySql

ในแบบสอบถามคุณต้องระบุชื่อของคลาสเอนทิตีที่คุณต้องการดึงข้อมูลจากในส่วนคำสั่ง FROM ของแบบสอบถาม

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

ที่นี่ผู้ใช้คือชื่อของคลาส Java Entity ของฉัน (พิจารณาปลอกของชื่อเช่นเดียวกับใน Java ที่มีความสำคัญ)


0

อีกวิธีหนึ่งที่ใช้ได้ผล:

ออบเจ็กต์การเข้าถึงข้อมูลที่ทำให้เกิดข้อยกเว้นนี้คือ

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

ข้อผิดพลาดที่ฉันทำในตัวอย่างข้างต้นคือฉันใช้ชื่อตาราง foo ใน createQuery แต่ฉันต้องใช้ Foo ซึ่งเป็นชื่อชั้นเรียนจริงๆ

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

ขอบคุณบล็อกนี้: https://www.arundhaj.com/blog/querysyntaxexception-not-mapped.html


0

บุคคลอื่นที่ใช้คลาสการแม็ปสำหรับไฮเบอร์เนตตรวจสอบให้แน่ใจว่าได้ระบุที่อยู่อย่างถูกต้องไปยังแพ็กเกจโมเดลในการประกาศ sessionFactory bean ในส่วนต่อไปนี้:

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

ข้อผิดพลาดที่ฉันทำในตัวอย่างข้างต้นคือฉันใช้ชื่อตาราง foo ใน createQuery แต่ฉันต้องใช้ Foo ซึ่งเป็นชื่อชั้นเรียนจริงๆ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.