0

我有两个类,分别是专家和技术,一个专家可以掌握几种技术,一种技术是由几个专家组成的。添加、更新技术独立于专家类。从专家那里删除一项技术,只删除相关的关系。

Class Expert{
     Long id; // getter and setter
     String name; // getter and setter;
     Set<Technology> technos; // getter and setter
} 

Technology{
     Long id; // gettter and setter
     String name; //getter and setter
}

hibernate映射中反映的两个类之间的关系是

<class name="Expert">
    <!-- put the declaration for id and name --> 

    <set name="technos" table="EXPERT_TECHNO" cascade="delete-orphan">
            <key column="id_expert"/>
            <many-to-many column="id_techno" class = "Technology"/>
    </set>
</class>

<class name="Technology">
 <!-- put declaration for id and name-->
</class>

现在我有一个Technology的实例,我想找到所有maitrise该技术的专家,那么如何使用hibernate critera得到结果集呢?或者使用 createQuery 获取结果集的最简单方法。

我不熟悉hibernate critera方法,所以我寻求您的帮助!

进一步的问题:

当我想从专家那里删除一项技术时,我想要的只是删除表“EXPET_TECHNO”中的一行,但是,我所拥有的是expert.getTechnos.remove(techno),将从表中删除该技术我不想拥有什么!

4

1 回答 1

2

首先,解决此问题的最简单方法是使 ManyToMany 关联是双向的。你只需要做

Set<Expert> experts = technology.getExperts();

现在,如果它不是一个选项,HQL 将比 Criteria 更容易进行这样的查询,它不是动态组合的。查询将很简单

select expert from Expert expert 
inner join expert.technos techno 
where techno.id = :technoId

如果您真的真的想使用 Criteria 执行此操作,那么您需要执行以下操作:

Criteria c = session.createCriteria(Expert.class, "expert");
c.createAlias("expert.technos", "techno");
c.add(Restrictions.eq("techno.id", technoId));

您可以自己找到它,并通过阅读Hibernate 文档了解许多其他内容。

于 2012-05-16T11:46:04.987 回答