7

次の「モデル」を検討します。

USER
    Long: PK
    String: firstName
    String: lastName

USER_EXT
    Long: PK
    String: moreInfo
    Date: lastModified

「fromUser」のような単純なHQLクエリで、次のSQLを生成するように、(アノテーションを使用して)正しいHibernateマッピングを検索/作成しようとしています。

select firstName, moreInfo from USER, USER_EXT where user.pk = user_ext.pk

@Secondarytableから@OneToOneアソシエーションまで、すべてを試しましたが、機能させることができません。

私が今得ている最良の結果は、複数のSQLクエリを生成する@OneToOneアソシエーションを使用したものです。1つはUSERで行をフェッチし、結果セットの各行に対してUSER_EXTからクエリを選択します。

これはまったく効果がありません。

何か案が ?

4

1 に答える 1

3

との選択はOneToOneSecondarytableオブジェクトモデルによって異なります(つまり、ユーザー拡張機能のエンティティが必要な場合)。OneToOneアソシエーションと2つのエンティティを使用することにしました。

(共有主キーのUserの使用に注意してください) :PrimaryKeyJoinColumn

@Entity
public class User {

    @Id private Long id;
    private String firstName;
    private String lastName;

    @OneToOne
    @PrimaryKeyJoinColumn
    private UserExt userExt;

    public UserExt getUserExt() {
        return userExt;
    }
    public void setUserExt(UserExt userExt) {
        this.userExt = userExt;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

そしてUserExt

@Entity
public class UserExt {

    @Id private Long id;
    private String moreInfo;
    @Temporal(TemporalType.DATE)
    private Date lastModified;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getMoreInfo() {
        return moreInfo;
    }
    public void setMoreInfo(String moreInfo) {
        this.moreInfo = moreInfo;
    }
    public Date getLastModified() {
        return lastModified;
    }
    public void setLastModified(Date lastModified) {
        this.lastModified = lastModified;
    }   
}

上記のエンティティを使用すると、次のHQLクエリが実行されます。

select u.firstName, u.userExt.moreInfo from User u

次のSQLクエリを生成します。

select
  userx0_.firstName as col_0_0_,
  userextx1_.moreInfo as col_1_0_ 
 from
  User userx0_,
  UserExt userextx1_ 
 where
  userx0_.id=userextx1_.id

これは期待される結果です。

PS:JPA 1.0は、実際には派生識別子のサポートが不十分であり(JPA 2.0の方がはるかに優れています)、Hibernate固有のジェネレーターを使用しない限り、Idで手動で設定する必要があります。詳細については、以下の質問を参照してください。UserExtforeign

関連する質問

于 2010-08-18T15:40:54.903 に答える