2

プロパティを持つUserクラスがあり@OneToMany List<Address>ます。Hibernate は、ユーザーとアドレスの間の結合テーブルを作成しました。ユーザーがログインすると、カスタム SQL クエリを使用してユーザーを探します。

select * from user where username = ? and password = ?

これは明らかに user の他のすべてのフィールドを返しますが、List<Address>. カスタムクエリを使用せずに Hibernate でリレーショナルデータを返す方法はありますか?

上記のカスタム クエリを使用してユーザーを読み込み、その ID を取得してから、ユーザーを再読み込みして、Hibernate がすべてのフィールドを読み込むようにすることはできますか? より良い方法はありますか?

@Entity
public class User {

    @Id
    @GeneratedValue
    @GenericGenerator(name = "incremental", strategy = "increment")
    private Long userID;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String email;

    @Column(nullable = false)
    private String password;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "user_address", 
        joinColumns = @JoinColumn(name = "userID"), 
        inverseJoinColumns = @JoinColumn(name = "addressID"))
    private List<Address> addresses;
}

@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @NonVisual
    public Long addressID;
}
4

2 に答える 2

2

以下のように HQL を使用してみてください。

String queryString = "select u from User u left join u.addresses "+
                     "where u.username = :userName and u.password = :password";

編集: HQL を実行するサンプル コード

String queryString = "select u from User u left join u.addresses "+
                     "where u.username = :userName and u.password = :password";
Query query = session.createQuery(queryString );
query.setParameter("userName", userNameValue);
query.setParameter("password", passwordValue);
List<User> users = query.list();
于 2012-11-27T19:50:56.633 に答える
0

デフォルトで遅延プロパティの関連付けがオンになっておりgetAddresses()、遅延コレクションを取得するためにユーザーを呼び出す必要があります。

コレクションを初期化するには、もう少し作業が必要です。もちろん、コレクション全体をトラバースして手動で行うこともできますが、Hibernate ユーティリティ クラスを呼び出してそれを行う方がよいでしょう。このHibernate.initializeメソッドはオブジェクトを引数として取り、遅延関連付け (コレクションを含む) を初期化します。したがって、ユーザーを完全に初期化し、次にアドレスのコレクションを完全に初期化する場合:

Object[] userObject; // the object returned by the query.
User u = new User(userObject); // create the user
Hibernate.initialize(u); // initializes user
Hibernate.initialize(u.getAddresses()); // pass the lazy collection into the session to be initialized.
于 2012-11-27T20:26:48.237 に答える