9

Hibernate 4 で Oracle ビューをクエリすると、0 より大きいサイズのリストが返されます。これは、たとえば SQL Developer で同じクエリを実行したときに取得する要素の数を表します。ただし、リストをループすると、null 値しか取得できません。

私の hibernate.cfg.xml は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

    <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:OUT</property>
    <property name="hibernate.connection.username">username</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.default_schema">schema</property>

    <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

    <property name="hibernate.connection.pool_size">1</property>

    <property name="hibernate.current_session_context_class">thread</property>

    <property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="hibernate.hbm2ddl.auto">update</property>

    <mapping resource="be/comp/model/db/VwPersoneelslid.hbm.xml"/>
</session-factory>

VwPersoneelslid.hbm.xml は次のようになります。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 9-aug-2013 10:13:31 by Hibernate Tools 4.0.0 -->
<hibernate-mapping>
<class name="be.comp.model.db.VwPersoneelslid" table="VW_PERSONEELSLID">
    <composite-id name="id" class="be.comp.model.db.VwPersoneelslidId">
        <key-property name="pkVwPersoneelslid" type="double">
            <column name="PK_VW_PERSONEELSLID" precision="126" scale="0" />
        </key-property>
        <key-property name="fkVwFunctie" type="double">
            <column name="FK_VW_FUNCTIE" precision="126" scale="0" />
        </key-property>
        <key-property name="familienaam" type="string">
            <column name="FAMILIENAAM" length="80" />
        </key-property>
        <key-property name="voornaam" type="string">
            <column name="VOORNAAM" length="80" />
        </key-property>
        <key-property name="code" type="string">
            <column name="CODE" length="10" />
        </key-property>

    </composite-id>
</class>

クエリを使用した関数は次のとおりです。

public List<VwPersoneelslid> findByCode(String code)
{
    Session session = HibernateUtil.getSessionFactoryNeptunus().getCurrentSession();
    session.beginTransaction();

    List<VwPersoneelslid> list = new ArrayList();

    Query query = session.createQuery("FROM VwPersoneelslid WHERE code = :code"); 
    query.setParameter("code", code);
    list = query.list();

    session.getTransaction().commit();

    return list;
}

ネイティブ SQL に変換された関数:

public List<VwPersoneelslid> findByCode(String code)
{
    Session session = HibernateUtil.getSessionFactoryNeptunus().getCurrentSession();
    session.beginTransaction();

    List<VwPersoneelslid> list = new ArrayList();

    Query query = session.createSQLQuery("SELECT * FROM CIPALII.VW_PERSONEELSLID WHERE code = :code").addEntity(VwPersoneelslid.class)
            .setParameter("code", code);

    list = query.list();

    session.getTransaction().commit();

    return list;
}

何が問題なのかを知るためにさらに情報が必要な場合は、お知らせください。コードを追加します。VwPersoneelslid.hbm.xml ファイルは、Eclipse によって自動生成されます。ありがとう。

4

4 に答える 4

4

回避策を作成することができました。少なくとも私にとっての問題は、Hibernate Tools が composite-id を作成するという事実にあります。いくつかのフープを飛び越えなければ、正しく動作することはできません。だから私はコンポジットIDを取り除くことができました。reveng.xml ファイルに次を追加しました。

<table name="VW_PERSONEELSLID">
    <primary-key>
        <key-column name="PK_VW_PERSONEELSLID" />
    </primary-key>
</table>

これにより単一の ID (PK_VW_PERSONEELSLID) が生成され、Hibernate Tools を引き続き使用できるようになります。これが汚い修正かどうかはわかりません。おそらく数日でそれがわかるでしょう。

于 2013-08-19T13:16:09.553 に答える
2

Hibernate HQL クエリは Entities を扱います。ビューは、データベースまたは SQL スキーマの概念です。HQL を使用してデータを照会するときは、エンティティ名とエンティティ プロパティについて言及します。したがって、 Views からクエリを実行する場合は、HQL クエリの代わりに Hibernate で Core SQL クエリを使用します。

于 2013-08-13T06:49:41.827 に答える