2014-09-28 57 views
4

努力學習Hibernate的命名查詢,我想學習如何執行NamedQuries但evertime我得到Exception in thread "main" org.hibernate.MappingException: Named query not known。請幫我在這裏MappingException:不知道

錯誤只有消息,不顯示完整堆

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> 

我GOOGLE了一切可能但我認爲我忽視了一些基本的東西。任何跡象表明,在正確的方向表示讚賞! :)

有一件事我考慮的是,如果我在類文件NamedQueries定義,我不需要提到它在XML file.Please糾正我,如果我錯了!

+2

你爲什麼要同時使用一個類及其註釋和xml文件,todefine同一類的映射?只需使用其中的一個(最好是類和它的註釋)。還要注意這兩個查詢都不正確。 '*'是SQL,而不是HQL。 HQL使用實體名稱(即類名稱),而不是表名。而第二個查詢中未定義「h」。 – 2014-09-28 10:39:13

+0

@JBNizet:好的......你的意思是說,如果我在'Employee.java'中有'annotations',我不需要'employee.hbm.xml'? – NoobEditor 2014-09-28 10:41:08

+0

不,你不需要它。當註釋不存在時,XML映射非常有用(Java 4,我們在Java 8)。 – 2014-09-28 10:42:13

回答

5

有幾個問題在這裏:

  1. 你的命名查詢應使用實體不表。如果你想要原生查詢,你應該使用NamedNativeQuery

  2. 提取查詢時不需要提供實體名稱。

    更改此:

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

    到:

    Query query = session.getNamedQuery("FindCountOfNames"); 
    
+0

y ...我已經解決了這個問題,但還是謝謝! :) – NoobEditor 2014-09-29 10:03:46

+0

雖然有一個問題...當我得到'SQL'查詢打印它打印一些其他的名字,像'選擇employee_0_o ...'這樣的,但表被映射爲'員工'只...這是正常的嗎? – NoobEditor 2014-09-29 10:05:23

+0

這是在表名之後,它是Hibernate表別名。完全不用擔心。 – 2014-09-29 10:11:31