Spring 如何在Hibernate中向Criteria API添加限制

Spring 如何在Hibernate中向Criteria API添加限制,spring,hibernate,jakarta-ee,hibernate-mapping,hibernate-criteria,Spring,Hibernate,Jakarta Ee,Hibernate Mapping,Hibernate Criteria,我是冬眠和春天的新手。我的问题是“如何添加标准…”在这样的情况下,我有两个bean: 1) 语言: public class Language { private int languageId; private String languageName; private List<Topic> listOfAllTopics; } 我的数据库表: 1) 语言 2) 话题 Hibernate映射xml文件包括: 1) Language.hbm.xml <h

我是冬眠和春天的新手。我的问题是“如何添加标准…”在这样的情况下,我有两个bean:

1) 语言:

public class Language {
    private int languageId;
    private String languageName;
    private List<Topic> listOfAllTopics;
}
我的数据库表:

1) 语言

2) 话题

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();
}
公共列表getAllLanguages(){ Criteria=getSession().createCriteria(Language.class); 返回条件。list(); } 但是,当我尝试使用标准获取特定语言(由langId)的所有主题时,它不起作用。 实际上,我不知道在这种情况下如何使用标准

public List<Topic> getAllTopicOfLanguage(Language language) {
    Criteria criteria = getSession().createCriteria(Topic.class);
    criteria.add(Restrictions.eq("?");
    return criteria.list();
}
公共列表getAllTopicOfLanguage(语言){
Criteria=getSession().createCriteria(Topic.class);
标准。添加(限制。等式(“?”);
返回条件。list();
}

主题的表cheme具有外键约束
语言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>
或者,您可以在对象本身上使用相等,而不是它们的id,或者使用
Expression.eqId(object object)

忠告:

使用带有标识符字段的抽象超类可以使事情更一般化。在类和表上对标识符命名一次
topicId
,在类和表上对标识符命名一次
languageId
,只会增加开销。在属性、类和表上使用
id
可以使事情更简单。
在更大的应用程序中,这将变得更加明显。

您的主题表cheme具有外键约束
language\u 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>
或者,您可以在对象本身上使用相等,而不是它们的id,或者使用
Expression.eqId(object object)

忠告:

使用带有标识符字段的抽象超类可以使事情更一般化。在类和表上对标识符命名一次
topicId
,在类和表上对标识符命名一次
languageId
,只会增加开销。在属性、类和表上使用
id
可以使事情更简单。
在更大的应用程序中,这将变得更加明显。

您通过错误的方式搜索结果,根据您的设计,您将通过

public Language getAllTopicOfLanguage(Language language) {
    Criteria criteria = getSession().createCriteria(Language.class);
    criteria.add(Expression.eq("languageId",language.getLanguageId()));
    return (Language)(criteria.list().get(0));
}
这将返回Language DTO对象,主题列表仅与Language DTO中填写的语言id相匹配


由于您是新手,我想告诉您,当您使用hibernate时,您的DTO和表设计应该非常精确。

您通过错误的方式搜索结果,根据您的设计,您将通过

public Language getAllTopicOfLanguage(Language language) {
    Criteria criteria = getSession().createCriteria(Language.class);
    criteria.add(Expression.eq("languageId",language.getLanguageId()));
    return (Language)(criteria.list().get(0));
}
这将返回Language DTO对象,主题列表仅与Language DTO中填写的语言id相匹配

作为新手,我想告诉您,当您使用hibernate时,DTO和表的设计应该非常精确

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