0

Oracle DB を使用して、PK を使用せずにテーブルを作成し (これが適切な方法ではないことは認識していますが、誰かが助けてくれることを望んでいます)、代わりに制約を使用する必要があります。DB にデータを挿入することはできますが、例外がスローされるため、残念ながら取得できません。

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


    }
}

前もって感謝します!

4

2 に答える 2

1

SELECTクエリの先頭にAがありません。

また、呼び出すcreateQuery()ときは JPQL/HQL を使用する必要があります。そのため、クエリを変更して HQL にする (エンティティ クラス名などを使用する) か、createSQLQuery()代わりに使用します。

于 2013-07-22T17:33:37.547 に答える
0

ここでいくつかの問題を見ることができます(間違っている可能性があります。間違っている場合は修正してください)-

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

HQL を使用しているため、 PERSON はプロパティ クラス名である Person である必要があります。

説明については、このリンクを確認してください。

ありがとう

于 2013-07-22T17:46:47.687 に答える