java - Hibernate 和约束主键抛出 QueryException

标签 java oracle hibernate constraints

使用oracle DB,我们创建了一个没有PK的表(我们知道这不是一个好的做法,但我们仍然希望有人可以帮助我们),我们需要使用约束作为替代方案。我们能够将数据插入数据库,不幸的是我们无法检索,因为它会引发异常。

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

hibernate 映射

<hibernate-mapping>
    <class name="com.sample.Person" table="PERSONS" schema="person_schema">
        <composite-id name="id" >
            <key-property name="name" column="NAME"  />
            <key-property name="nickname" column="NICKNAME" />
        </composite-id>

        <property name="address" type="java.lang.String">
            <column name="ADDRESS" length="100" />
        </property>

    </class>
</hibernate-mapping>

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);


    }
}

提前致谢!

最佳答案

查询开头缺少 SELECT

调用createQuery()时,您必须使用JPQL/HQL。因此,要么修改您的查询以使其成为 HQL(使用实体类名称等...),要么使用 createSQLQuery() 代替。

关于java - Hibernate 和约束主键抛出 QueryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17793643/

相关文章:

Oracle:搜索所有存储的过程/触发器/其他数据库代码?

java - 在我的 UI 中复制并显示 Oracle 的 API Javadoc 是否可以

java - 单个非标识字段中的 Hibernate UUID 生成器

java - JPA、Hibernate - 处理包含在 RollbackException 中的 ContraintViolationException

java - 没有从测试用例中调用 Spring DeferredResult onCompletion

用用户输入填充二维数组时出现 java.lang.ArrayIndexOutOfBoundsException

java - 我可以在不扩展的情况下访问 Sphere 类的几何形状吗?

oracle - 甲骨文NUMBER hive

java - 如何解决 org.openqa.selenium.NoSuchElementException

java - Hibernate:@OneToOne 未在数据库中生成 "one to one"关系