我如何在Hibernate HQL查询或Criteria API调用中加入这些?

时间:2012-09-04 19:54:22

标签: java hibernate hql

Person.java:

public class Person  implements java.io.Serializable {
    private int id;
    private String fullName;

    public Person() {
    }

    public Person(int id, String fullName) {
        this.id = id;
        this.fullName = fullName;
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

ProjectGroup.java:

public class ProjectGroup  implements java.io.Serializable {
    private int id;
    private Set<Person> persons = new HashSet<Person>(0);
    private String name;

    /**
     * Get the value of name
     *
     * @return the value of name
     */
    public String getName() {
        return name;
    }

    /**
     * Set the value of name
     *
     * @param name new value of name
     */
    public void setName(String name) {
        this.name = name;
    }

    public ProjectGroup() {
    }


    public ProjectGroup(int id, String name, Set<Person> persons) {
       this.id = id;
       this.name = name;
       this.persons = persons;
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }
    public Set<Person> getPersons() {
        return this.persons;
    }

    public void setPersons(Set<Person> persons) {
        this.persons = persons;
    }

}

Person.hbm.xml:

<hibernate-mapping>
    <class name="com.mycompany.Person" table="person" schema="public">
        <id name="id" type="int">
            <column name="id" />
            <generator class="identity" />
        </id>

        <property name="fullName" type="string">
            <column name="full_name" length="128" not-null="true" />
        </property>

        <set name="projectGroups" inverse="false" lazy="false" cascade="delete" table="group_person">
            <key>
                <column name="project_id" />
            </key>
            <many-to-many entity-name="com.mycompany.ProjectGroup">
                <column name="group_id" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>

ProjectGroup.hbm.xml:

<hibernate-mapping>
    <class name="com.mycompany.ProjectGroup" table="project_group" schema="public">
        <id name="id" type="int">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="string">
            <column name="name" length="32" not-null="true" />
        </property>
        <set name="persons" inverse="false" table="group_person">
            <key>
                <column name="group_id" />
            </key>
            <many-to-many entity-name="com.mycompany.Person">
                <column name="project_id" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>

我需要做的是加载具有特定组的所有用户。我知道如何用SQL做到这一点,但Hibernate等效于我。

1 个答案:

答案 0 :(得分:1)

首先,添加到您Person中声明的projectGroups班级,Person.hbn.xml。然后,使用此条件选择特定组的所有用户:

Criteria c = session.createCriteria(Person.class);
c.createAlias("projectGroups", "pg");
c.add(Restrictions.eq("pg.name", "project-name"));

或者这个HQL:

from Person as person 
    join person.projectGroups as pg 
        with pg.name = 'project-name'