2014-09-28 60 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