2012-02-13 71 views
2

我试图使用Hibernate从表中选择数据时遇到错误,我试过两种方法,面临以下错误。尝试使用Hibernate执行SELECT操作时出错

方法1

private static void queryPerson(Session session) { 

    String SQL_QUERY ="Select person.ID as ID,person.NAME as NAME ,person.SURNAME AS SURNAME,person.ADDRESS as ADDRESS From person"; 
     Query query = session.createQuery(SQL_QUERY); 
     for(Iterator it=query.iterate();it.hasNext();){ 
     Object[] row = (Object[]) it.next(); 
     System.out.println("ID: " + row[0]); 
     System.out.println("Name: " + row[1]); 
     System.out.println("Amount: " + row[2]); 
     session.getTransaction().commit(); 
     } 

这引发以下错误:

Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: person is not mapped [Select person.ID as ID,person.NAME as NAME ,person.SURNAME AS SURNAME,person.ADDRESS as ADDRESS From person] 
at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180) 
at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:111) 
at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93) 
at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:327) 
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3441) 

方法2:

private static void queryPerson(Session session) { 
    Query query = session.createQuery("from Person");     
    List <Person>list = query.list(); 
    java.util.Iterator<Person> iter = list.iterator(); 
    while (iter.hasNext()) { 

     Person person = iter.next(); 
     System.out.println("Person: \"" + person.getName() +"\", " + person.getSurname() +"\", " +person.getAddress()); 
    session.getTransaction().commit(); 

    } 

抛出以下错误:

Caused by: org.postgresql.util.PSQLException: ERROR: column person0_.id does not exist 
Position: 8 
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102) 
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835) 

如果有人能指出我哪里出错了,那将会很棒。 谢谢! 编辑: Person.hbm.xml

<class name="com.sample.Person" table="Person"> 

    <id name="id" column="ID"> 
     <generator class="native" /> 
    </id> 

    <property name="name"> 
     <column name="NAME" length="16" not-null="false" /> 
    </property> 

    <property name="surname"> 
     <column name="SURNAME" length="16" not-null="false" /> 
    </property> 

    <property name="address"> 
     <column name="ADDRESS" length="16" not-null="false" /> 
    </property> 

</class> 

的hibernate.cfg.xml

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


    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> 
    <property name="hibernate.connection.url">jdbc:postgresql://localhost/testDB</property> 
    <property name="hibernate.connection.username">postgres</property> 
    <property name="hibernate.connection.password"></property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 

    <!-- Automatic schema creation (begin) === --> 
    <property name="hibernate.hbm2ddl.auto">validate</property> 


    <!-- Simple memory-only cache --> 
    <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property> 

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

    <!-- ############################################ --> 
    <!-- # mapping files with external dependencies # --> 
    <!-- ############################################ --> 

    <mapping resource="com/sample/Person.hbm.xml" /> 

</session-factory> 

编辑:这里是Person类,即时通讯使用:

package com.sample; 

public class Person { 
    Long id; 
    String name; 
    String surname; 
    String address; 

public Long getId() { 
    return id; 
} 
private void setId(Long id) { 
    this.id = id; 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public String getSurname() { 
    return surname; 
} 
public void setSurname(String surname) { 
    this.surname = surname; 
} 
public String getAddress() { 
    return address; 
} 
public void setAddress(String address) { 
    this.address = address; 
} 
}   
+1

你映射了Person吗? – DagR 2012-02-13 09:28:54

+1

人没有被映射..可能它应该是Person? http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-casesensitivity – 2012-02-13 09:28:57

+0

你的映射文件在哪里? – 2012-02-13 09:31:08

回答

4

尝试这种情况:

person.hbm.xml

<?xml version="1.0"?> 
<!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.sample.Person" table="Person"> 
     <id name="id" column="ID"> 
     <generator class="native" /> 
    </id> 
    <property name="name"> 
     <column name="NAME" length="16" not-null="false" /> 
    </property> 

    <property name="surname"> 
     <column name="SURNAME" length="16" not-null="false" /> 
    </property> 

    <property name="address"> 
     <column name="ADDRESS" length="16" not-null="false" /> 
    </property> 
</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> 
     ...your database configurations and mapping file... 

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

HibernateUtil.java

public class HibernateUtil { 

     private static final SessionFactory sessionFactory; 

     static { 
      try { 
       // Create the SessionFactory from hibernate.cfg.xml 
       // ------ --- -------------- ---- ----------------- 
       sessionFactory = new Configuration().configure() 
         .buildSessionFactory(); 
      } catch (Throwable ex) { 
       // Make sure you log the exception, as it might be swallowed 
       // ---- ---- --- --- --- ---------- -- -- ----- -- --------- 
       System.err.println("Initial SessionFactory creation failed." + ex); 
       throw new ExceptionInInitializerError(ex); 
      } 
     } 

     /** 
     * Get the configured session factory 
     * 
     * @return session factory 
     */ 
     public static SessionFactory getSessionFactory() { 
      return sessionFactory; 
     } 
    } 

一个例子:

public class PersonExample{ 
    public static void main(String[] args) { 
     Session session = null; 
     try { 
      SessionFactory sessionFactory = new Configuration().configure() 
        .buildSessionFactory(); 
      session = sessionFactory.openSession(); 
      System.out.println("Starting select"); 
      List<Person> persons= session.createSQLQuery("select {p.*} from Person p").addEntity("p", Person.class).list(); 
      for (Iterator<Person> it = persons.iterator(); it.hasNext();) { 
      Person stObject = it.next(); 
       System.out.println("ID: " + stObject.getId()); 
       System.out.println("Surname: " + stObject.getSurname()); 
       System.out.println("Name: " + stObject.getName()); 
       System.out.println("Address: " + stObject.getAddress()); 
      } 
      System.out.println("Finished select"); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      e.printStackTrace(); 
     } finally { 
      // Actual contact insertion will happen at this step 
      session.flush(); 
      session.close(); 
     } 

    } 
} 
+0

嘿了例如由于:但在试图这样我得到: org.hibernate.exception.SQLGrammarException:在org.hibernate.exception.SQLStateConverter.convert无法执行查询 \t (SQLStateConverter.java:92) 引起:org.postgresql.util.PSQLException:错误:列p.id不存在 位置:8. 任何想法为什么会发生这种情况? – KodeSeeker 2012-02-13 11:07:45

+0

是的,我确实有在Person类中的字段名和列以及 – KodeSeeker 2012-02-13 12:31:14

+0

下面是使用 CREATE TABLE人 ( “ID” BIGINT NOT NULL DEFAULT NEXTVAL( 'hibernate_sequence' :: regclass的)表IM的脚本, “名称” 字符改变, 姓字符改变, 地址字符改变, 约束person_pkey PRIMARY KEY( “ID”) ) WITH( OIDS = FALSE ); ALTER TABLE人员postgres; 和自动增量,我不认为postgresql提供的,所以我做的pkey指的序列。 – KodeSeeker 2012-02-14 04:11:06

1

你提供一流的人与注释@Entity?

HQL与SQL不同。我觉得有什么不对您的查询:

String SQL_QUERY ="Select person.ID as ID,person.NAME as NAME ,person.SURNAME AS SURNAME,person.ADDRESS as ADDRESS From person";

试着这么做: HQL:从人选择person.id,person.name,person.surname,person.address作为人

总是大写表名,匹配你的类名。 对于列名称,这些必须与您的实例变量匹配。

更新(与Unitils Hibernate映射试验):

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.unitils.UnitilsJUnit4TestClassRunner; 
import org.unitils.orm.hibernate.HibernateUnitils; 
import org.unitils.spring.annotation.SpringApplicationContext; 

/** 
* Unitils mapping test class. 
* 
*/ 
@SpringApplicationContext({ "spring.xml" }) 
@RunWith(UnitilsJUnit4TestClassRunner.class) 
public class HibernateMappingTest { 

    @Test 
    public void testMappingToDatabase() { 
     HibernateUnitils.assertMappingWithDatabaseConsistent(); 
    } 

}

+0

林hibernate_sequence \t:缺少序列或表试图做到没有注释。正如我所遵循的例子没有提及任何对他们的提及 – KodeSeeker 2012-02-13 09:35:05

+0

你是否用大写Person来试用它? – 2012-02-13 09:39:35

+0

@kclaes他/她在方法2中做了这个。 – soulcheck 2012-02-13 09:42:15

1

被映射的类和别名的名称缺失。您的查询应该是:

Select person.ID as ID,person.NAME as NAME ,person.SURNAME AS SURNAME,person.ADDRESS as ADDRESS From Person as person 

注意'From Person'中的大写'P'。我假设方法1中的代码基础和方法2是相同的。在方法2中,除非您的意图是执行本地sql,否则类名称是'Person'而非'person'。在这种情况下,您应该调用session.createSQLQuery并尝试是否能够直接对数据库执行相同的查询。

从方法2异常追踪,您的映射是错误的。验证表是否存在,列名是否在映射中正确。

+0

:试过你的方法,并得到了下面的错误(假设您提供的查询是针对方法1): nitial创建SessionFactory failed.org.hibernate.HibernateException:缺少序列或表:hibernate_sequence 引起:org.hibernate.HibernateException:缺少序列或表:hibernate_sequence。我应该在哪里创建这个序列? – KodeSeeker 2012-02-13 09:59:27

+0

这可能有所帮助,http://stackoverflow.com/a/9175862/11092 – Adi 2012-02-13 10:27:51

+0

@Adi-做到了这一点,并得到以下错误: 线程“主”异常org.hibernate.exception.SQLGrammarException:无法执行JDBC批处理更新 aused by:java.sql.BatchUpdateException:批处理条目0插入Person(NAME,SURNAME,ADDRESS,ID)值('Barak','Obhama','White House','1')被中止。调用getNextException来查看原因。 好像林兜兜转转:■ – KodeSeeker 2012-02-13 10:59:02

相关问题