1

3 つのエンティティがあり、メイン (ユーザー) エンティティは他の 2 つのエンティティと関連しています。休止状態を使用して 1 つのクエリでデータベースから 3 つのエンティティのリストを取得するにはどうすればよいですか?

package hib.test;

import java.util.HashSet;
import java.util.Set;

public class Country {
    private Integer id;
    private String country;
    private Set<User> userList = new HashSet<User>();

    public Country() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Integer getId() {
        return id;
    }

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

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public Set<User> getUserList() {
        return userList;
    }

    public void setUserList(Set<User> userList) {
        this.userList = userList;
    }

}

ユーザー.java

package hib.test;

public class User {
    private Integer id;
    private UserType userType;
    private Country country;

    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Integer getId() {
        return id;
    }

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

    public UserType getUserType() {
        return userType;
    }

    public void setUserType(UserType userType) {
        this.userType = userType;
    }

    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

}

ユーザータイプ.java

package hib.test;

import java.util.HashSet;
import java.util.Set;

public class UserType {
    private Integer id;
    private String userType;
    private Set<User> userList = new HashSet<User>();

    public UserType() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Integer getId() {
        return id;
    }

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

    public String getUserType() {
        return userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

    public Set<User> getUserList() {
        return userList;
    }

    public void setUserList(Set<User> userList) {
        this.userList = userList;
    }

}

国.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Jun 6, 2012 1:12:01 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="hib.test.Country" table="COUNTRY">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="country" type="java.lang.String">
            <column name="COUNTRY" />
        </property>
        <set name="userList" table="USER" inverse="false" lazy="true">
            <key>
                <column name="ID" />
            </key>
            <one-to-many class="hib.test.User" />
        </set>
    </class>
</hibernate-mapping>

user.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Jun 6, 2012 1:12:01 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="hib.test.User" table="USER">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <many-to-one name="userType" class="hib.test.UserType" fetch="join">
            <column name="USERTYPE" />
        </many-to-one>
        <many-to-one name="country" class="hib.test.Country" fetch="join">
            <column name="COUNTRY" />
        </many-to-one>
    </class>
</hibernate-mapping>

usertype.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Jun 6, 2012 1:12:01 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="hib.test.UserType" table="USERTYPE">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="userType" type="java.lang.String">
            <column name="USERTYPE" />
        </property>
        <set name="userList" table="USER" inverse="false" lazy="true">
            <key>
                <column name="ID" />
            </key>
            <one-to-many class="hib.test.User" />
        </set>
    </class>
</hibernate-mapping>

どうすれば取得できますか 1 つのクエリList<User>List<Country>List<UserType>

編集

public static List<UserType> getUserTypeList() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = null;
    List<UserType> list = null;
    try {
        transaction = session.beginTransaction();
        list = session.createQuery("from UserType as u").list();
        if (list != null) {
            for (UserType uType : list)
                Hibernate.initialize(uType.getUserList());
        }
        transaction.commit();
    } catch (Exception e) {
        if (transaction != null)
            transaction.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }
    return list;
}

実際には、UserType と Country にそれぞれ 1 つの JTable と 2 つのコンボ ボックスがあるため、コンボ ボックスで任意のデータを選択すると、JTable データは選択した値に応じてフィルター処理され、選択した UserType と Country オブジェクトをメモリに保存する必要があります。

4

3 に答える 3

0

そのためには、次の 3 つのクエリが必要です。

select u from User u;
select ut from UserType ut;
select c from Country c;

編集:

実際に必要なものが、すべてのユーザー タイプのリストであり、各ユーザー タイプのユーザーと各ユーザー タイプの各ユーザーの国が含まれている場合、これらすべてが 1 つのクエリに読み込まれます。Hibernateのドキュメント:

select userType from UserType userType
left join fetch userType.users user
left join fetch user.country
于 2012-06-06T07:45:05.057 に答える
0

一度にリレーショナル データが必要で、メモリが問題にならない場合は、lazy="false"

于 2012-06-06T07:49:55.597 に答える
0

ユーザーマッピングでフェッチタイプをEAGERに定義してみてください。そのようにすると、ユーザーをロードすると国とuserTypeがロードされます。

于 2012-06-06T07:50:42.903 に答える