【问题标题】:How to add Restrictions to Criteria API in Hibernate如何在 Hibernate 中向 Criteria API 添加限制
【发布时间】:2012-12-10 09:17:59
【问题描述】:

我是 Hibernate 和 Spring 的新手。我的问题是关于“如何添加标准……”在这种情况下,我有两个 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) 语言.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) 主题.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>

我使用这种方法在我的数据库中获取了所有语言,并且它工作正常。

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

【问题讨论】:

    标签: spring hibernate jakarta-ee hibernate-mapping hibernate-criteria


    【解决方案1】:

    您的主题表方案具有外键约束@​​987654321@,但您的类和 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)

    建议:

    使用带有标识符字段的抽象超类使事情更通用。在类和表Topic 上命名标识符一次topicId 和在类和表Language 上命名languageId 只是开销。只需在属性、类和表上使用id 即可让事情变得更简单。 在更大的应用程序中,这将变得更加明显。

    【讨论】:

      【解决方案2】:

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

      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和table的设计应该很精准。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多