MappingException: Benannte Abfrage nicht bekannt

Versuchen zu lernen, Hibernate, bin ich versucht zu lernen, wie zu ausführen NamedQuries aber evertime ich bin immer Exception in thread "main" org.hibernate.MappingException: Named query not known.Bitte helfen Sie mir hier

Fehler (nur die Nachricht, nicht die komplette stack)

Exception in thread "main" org.hibernate.MappingException: Named query not known: hibernate_tut_emp.Employee.FindCountOfNames
    at org.hibernate.internal.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:177)
    at org.hibernate.internal.SessionImpl.getNamedQuery(SessionImpl.java:1372)
    at hibernate_tut_emp.MyOps.main(MyOps.java:20)

Employee.java

package hibernate_tut_emp;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import javax.persistence.Table;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;



@Entity
@Table(name="Hib1")

@NamedQueries({
    @NamedQuery(name="GetDetailsByName" , query="select * from hib1 h where h.name=:name"),
    @NamedQuery(name="FindCountOfNames", query="select count(1) as cnt from hib1 h where h.name=:name")
})
public class Employee {
    private int id;
    private String name;

    @Id
    @Column(name="id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
            this.id = id;
    }

    @Column(name="name")
    public String getName() {
            return name;
    }

    public void setName(String empName) {
            this.name = empName;
    }


}

MyOps.java

package hibernate_tut_emp;

import java.util.Scanner;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class MyOps {

    public static void main(String[] args) {

        Scanner scnr = new Scanner(System.in);
        System.out.print("Enter a name : ");
        String name = scnr.next();

        SessionFactory ses = HibernateUtil.getSessionFactory();
        Session session = ses.openSession();

        Query query = session.getNamedQuery("hibernate_tut_emp.Employee.FindCountOfNames");


        query.setString("name", name);
        int count = ((Integer)query.iterate().next()).intValue();
        System.out.println("count : "+count);
    }
}

employee.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="hibernate_tut_emp.Employee" table="hib1">
        <id name="id" type="int" column="id">
            <generator class="native" />
        </id>
        <property name="name" type="string" column="name" />
    </class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
         <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
         <property name="connection.username">root</property>
         <property name="connection.password">mayank</property>

        <!-- JDBC connection pool (use the built-in) -->
         <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
          <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache -->
         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
         <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
         <property name="hbm2ddl.auto">update</property>

      <mapping class="hibernate_tut_emp.Employee" />
      <mapping resource="employee.hbm.xml"/>

     </session-factory>
 </hibernate-configuration>

Habe ich gegoogelt alles möglich, aber ich denke, ich bin mit Blick auf einige grundlegende Dinge.Jede Angabe in richtige Richtung, wird sehr geschätzt! 🙂

Eine Sache, die ich berücksichtigen ist, dass, wenn ich definiert habe, in der Klasse Datei NamedQueries brauche ich nicht zu erwähnen, es in xml - Datei.Bitte korrigieren Sie mich, wenn ich falsch bin!

Warum tun Sie verwenden beide die Klasse und Ihre Anmerkungen, und eine xml-Datei, todefine die Zuordnung der gleichen Klasse? Verwenden Sie einfach eine von Ihnen (die Klasse und Ihre Anmerkungen, die vorzugsweise). Beachten Sie auch, dass beide Abfragen falsch sind. * ist SQL, nicht HQL. HQL benutzt entity-Namen (z.B. Klassennamen), und nicht die Tabelle Namen. Und h ist nicht definiert in der zweiten Abfrage.
ok...also du meinst wenn ich annotations im Employee.java brauche ich nicht employee.hbm.xml?
Nein, Sie brauchen es nicht. XML-mapping ist nützlich, wenn die Anmerkungen nicht vorhanden ist (Java-4, sind wir bei Java 8).
Ich würde raten, dass, weil Sie die Zuordnung der Datei über employee.hbm.xml alle und alle Anmerkungen werden kurzerhand ignoriert. Sie müssen entfernen Sie alle hbm.xml Dateien und Ihre Referenzen. Dann sollten Sie beginnen, um startup-Fehler aufgrund Ihrer HQL unwirksam.
Yup, jetzt müssen Sie Lesen Sie die HQL-Dokumentation, und schreiben Sie einige gültige Abfragen. HQL != SQL! Vielleicht starten Sie mit from Employee where name = :name.

InformationsquelleAutor NoobEditor | 2014-09-28

Schreibe einen Kommentar