2013-07-22 55 views
0

使用oracle數據庫,我們創建了一個沒有PK的表(我們知道它不是一個好的做法,但我們仍然希望有人能夠幫助我們),我們需要使用約束作爲備選。我們能夠將數據插入到數據庫中,但不幸的是我們無法檢索,因爲它會引發異常。Hibernate和約束主鍵拋出QueryException

Exception in thread "main" org.hibernate.QueryException: could not resolve property: name of: hibernate.Person [FROM hibernate.Person WHERE name = :name AND nickname= :nickname] 

休眠映射

​​

PersonDao.java

package hibernate; 

import java.util.List; 

import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.Transaction; 

public class PersonDAO extends BaseHibernateDAO { 


    public List<Person> getAll(Person person) { 

     try { 
      Query query = getSession().createQuery("FROM PERSONS " + 
        "WHERE name = :name " + 
        "AND nickname = :nickname"); 

      query.setString("name", person.getName()); 
      query.setString("nickname", person.getNickname()); 

      List<Person> persons =(List)query.list(); 


      return persons; 
     } catch (RuntimeException re) { 
      System.out.println("get failed"); 
      throw re; 
     }finally{ 
      getSession().close(); 
     } 
    } 

    public void save(Person person) { 
     try { 
      Transaction tx = getSession().beginTransaction(); 
      getSession().save(person); 
      tx.commit(); 
     } ...  
    } 



} 

PersonId.java

package hibernate; 

import java.io.Serializable; 

public class PersonId implements Serializable { 
    private String name; 
    private String nickname; 
    private String address; 

    // getters & setters ..... 

    // an easy initializing constructor 
    public PersonId(String name, String nickname, String address){ 
     this.name = name; 
     this.nickname = nickname; 
     this.address = address; 
    } 

    @Override 
    public boolean equals(Object arg0) { 
     if(arg0 == null) return false; 
     if(!(arg0 instanceof PersonId)) return false; 
     PersonId arg1 = (PersonId) arg0; 
     return (this.name.equalsIgnoreCase(arg1.getName()) 
        && (this.nickname.equalsIgnoreCase(arg1.getNickname())) 
        && (this.address.equalsIgnoreCase(arg1.getAddress())) 
       ); 

    } 
    @Override 
    public int hashCode() { 
     int hsCode; 
     hsCode = name.hashCode(); 
     hsCode = hsCode + nickname.hashCode(); 
     hsCode = 19 * hsCode + address.hashCode(); 
     return hsCode; 
    } 
} 

Person.java

package hibernate; 

public class Person { 

    private PersonId id; 
    private String name; 
    private String nickname; 
    private String address; 

    //getters and setters ... 
} 

TestHibernate.java

package test; 

import hibernate.Person; 
import hibernate.PersonId; 
import hibernate.PersonDAO; 

import java.util.Iterator; 

public abstract class TestHibernate { 

    public static void main(String[] args) throws InterruptedException { 

/*  
     Person p = new Person(); 
     p.setPersonId(new PersonId("Foor", "Foo", "Sample Address")); 
     p.setName("Foor"); 
     p.setNickname("Foo"); 
     p.setAddress("Sample Address"); 
     p.setValue("0"); 
     PersonDao dao = new PersonDao(); 
     //dao.save(p); 
*/  
     Person p = new Person(); 
     p.setName("Foor"); 
     p.setNickname("Foo"); 

     PersonDao dao = new PersonDao(); 
     dao.getAll(p); 


    } 
} 

提前感謝!

回答

1

A SELECT在查詢開始時丟失。

當調用createQuery()時,您必須使用JPQL/HQL。因此,要麼修改您的查詢以使其成爲HQL(使用實體類名稱等),要麼改爲使用createSQLQuery()

0

我可以在這裏看到一些問題(我可能是錯的,糾正我,如果我這樣做) -

Query query = getSession().createQuery("FROM PERSONS " + 
        "WHERE name = :name " + 
        "AND nickname = :nickname"); 

,因爲你正在使用HQL, 人應該是人,屬性類的名稱。

Check this link作出解釋。

謝謝