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!
*
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehrere Themen hier:
Ihres namens Abfragen verwenden sollten Personen nicht die Tabellen. Wenn Sie möchten, native Abfragen, die Sie verwenden sollten NamedNativeQuery statt.
Brauchen Sie nicht, um die Versorgung der entity-Namen beim abrufen der Abfrage.
Ändern:
:
eine Frage, obwohl..., wenn ich das
SQL
Abfrage gedruckt, es druckt einige andere Namen, wieSelect employee_0_o ...
wie, aber die Tabelle ist abgebildet, wieemployee
nur...ist das normal?Das ist nach der Tabelle Namen, und es ist der Hibernate-Tabelle aliasing. Nichts zu befürchten.
aber es ist nicht, Holen Sie mir die gewünschte Ausgabe...ich bin mit der
FindCountOfNames
benannte Abfrage, aber egal, was ichset
zu den:name
ist, erhalte ich 0 als Ausgabe...irgendwelche Ideen?Ich denke, es ist besser, zu Fragen, eine neue Frage mit dem genauen aktuellen mapping und code-Beispiel. Ping mich an wenn du fertig bist.
InformationsquelleAutor Vlad Mihalcea