1

私はHibernateとSpringの初心者です。私の質問は、「基準を追加する方法…」という状況で、2つのBeanがあります。

1)言語:

public class Language {
    private int languageId;
    private String languageName;
    private List<Topic> listOfAllTopics;
}

2)トピック:

public class Topic {
    private int topicId;
    private String topicName;
}

私のデータベーステーブル:

1)言語

language_id       int(PK)
language_name     varchar(30)

2)トピック

topic_id          int(PK)
topic_name        varchar(30)
language_id       int(FK)

Hibernateマッピングxmlファイルは次のとおりです。

1)Language.hbm.xml

<hibernate-mapping package="com.mw.javamentordb.dto">
    <class name="Language" table="language" lazy="true">
        <id name="languageId" column="language_id" type="int">
            <generator class="increment" />
        </id>
        <property name="languageName" column="language_name"type="string"/>
        <bag name="listOfAllTopics" cascade="all">
        <key column="language_id" not-null="true" />
        <one-to-many class="Topic"/>
        </bag>
    </class>
</hibernate-mapping>

2)Topic.hbm.xml

<hibernate-mapping package="com.mw.javamentordb.dto">
    <class name="Topic" table="topics" lazy="true">
        <id name="topicId" column="topics_id" type="int">
            <generator class="increment" />
        </id>
        <property name="topicName" column="topics_name" type="string" />
    </class>
</hibernate-mapping>

そして、このメソッドを使用してデータベース内のすべてのlangを取得し、正しく機能します。

public List<Language> getAllLanguages() {
    Criteria criteria = getSession().createCriteria(Language.class);
    return criteria.list();
}

しかし、基準を使用して(langIdによって)特定の言語のすべてのトピックを取得しようとすると、機能しません。実はそんな状況で基準の使い方がわかりません。

public List<Topic> getAllTopicOfLanguage(Language language) {
    Criteria criteria = getSession().createCriteria(Topic.class);
    criteria.add(Restrictions.eq("?");
    return criteria.list();
}
4

2 に答える 2

1

トピックのテーブルchemeには外部キー制約language_idがありますが、クラスとhbm.xmlマッピングにはありません。

したがって、目的のクエリは実行できません。

次のように変更します。

public class Topic 
{
    private int topicId;
    private String topicName;
    private Language language;
}

そして、hbm.xmlのプロパティで:

<many-to-one name="language" class="package.Language" fetch="select">
    <column name="language_id">
</many-to-one>

次に、次のような基準を使用してクエリを実行できます。

criteria.add(Expression.eq("language.language_id", language.getLanguageId()));

または、IDの代わりにオブジェクト自体に等式を使用するか、Expression.eqId(Object Object)

助言:

物事をより一般的にするために、識別子フィールドで抽象スーパークラスを使用してください。topicIdクラスとテーブルTopic、およびlanguageIdクラスとテーブルで識別子に1回名前を付けるのLanguageは、オーバーヘッドです。プロパティ、クラス、テーブルで使用するだけidで、作業が簡単になります。大規模なアプリケーションでは、これはより明白になります。

于 2012-12-10T13:08:49.490 に答える
0

あなたは間違った方法で結果を検索しています、あなたのデザインに従って、あなたは結果を得るでしょう、

public Language getAllTopicOfLanguage(Language language) {
    Criteria criteria = getSession().createCriteria(Language.class);
    criteria.add(Expression.eq("languageId",language.getLanguageId()));
    return (Language)(criteria.list().get(0));
}

これにより、言語DTOオブジェクトが返され、言語IDに一致するトピックのリストが言語DTOにのみ入力されます。

初心者なので、Hibernateを使用している場合は、DTOとテーブルの設計が非常に正確である必要があることを伝えたいと思います。

于 2012-12-10T17:09:03.473 に答える