如何使用Hibernate Createcriteria从两个表(一对多关系)中获取数据

时间:2013-10-24 12:18:56

标签: hibernate-mapping

如何根据用户ID从两个表中获取数据? 的 * ** * ** * ** * ** * ** * * 角色类 * ** * ** * ** * ** * ** * ** * ** * *

    @Entity
    @Table(name = "IUC_CON_USER_ROLE_MAP")
    public class Role {
        @Id
        @Column(name="F_ROLE_MAP_ID")
        int rolemap;

        @Column(name="F_ROLE_ID")
        int roleid;


        @OneToMany(mappedBy="role",fetch=FetchType.EAGER)
        Set<User>  F_USER_ID;

** * ** * ** * 的** * ** * ** * ** * 用户类< / EM> * ** * ** * ** * ** * ** * ** *

    @Entity
    @Table(name = "IUC_CON_USER")
    public class User implements Serializable {


        @Id
        @Column(name = "F_USER_ID")
        private int id;

        @Column(name = "F_USER_NAME")
        private String name;

        @Column(name = "F_USER_PWD")
        private String pwd;


        @ManyToOne
        @JoinColumn(name="F_USER_ID",insertable=false,updatable=false)
        private Role role;

                 ----------setter and getter for properties
    }

外部编辑: 标准创建代码:

DetachedCriteria uCrit = DetachedCriteria.forClass(User.class, "user");
uCrit.add(Restrictions.eq("user.id", 5));
uCrit.setProjection(Projections.property("user.id"));
DetachedCriteria criteria = DetachedCriteria.forClass(Role.class, "role");
criteria.add(Property.forName("role.F_USER_ID").in(uCrit));
List lt1 = criteria.getExecutableCriteria(getSession()).list();

2 个答案:

答案 0 :(得分:0)

使用createAlias

criteria.createAlias("propertiy_of_main_entity", "aliastName");

对我而言,这通过某个实体属性名称获取与根实体相关联的实体;

在你的情况下像

createAlias("F_USER_ID", "roleUsers");

应该这样做。

无论如何,为什么你的字段名称在公共命名为Java的学说之后?的 WHY_IS_IT_UPPERCASED_WITH_DASHES_LIKE_CONSTANTS _吗

总而言之,Hibernate documentation解释了所有内容。如果别名不起作用,那么比在我提供的链接下的Hibernate文档中的示例中获取关联。

答案 1 :(得分:0)

您可以使用以下系列语句与User一起提取Role

int userId = 1;
Criteria criteria = session.createCriteria(User.class);
criteria.setFetchMode("role", FetchMode.JOIN);
criteria.add(Restrictions.eq("id", userId));
User user = (User) criteria.uniqueResult();

Hibernate的默认提取策略是懒惰地获取关联,如果你想在Role获取关联(这里是User),你需要在代码中在运行时覆盖这些关联。第三个声明是通过将获取模式设置为JOIN来完成此操作。此语句FetchMode.JOIN会覆盖默认行为,因此Role将与User一起提取。