Spring 如何在Hibernate中向Criteria API添加限制
我是冬眠和春天的新手。我的问题是“如何添加标准…”在这样的情况下,我有两个bean: 1) 语言: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
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));
}