2011-08-01 31 views
6

私はそのようなHibernateサービスメソッドを持っています:"SELECT sc FROM SecurityContact sc WHERE sc.securityId=:securityId2"。 securityId2はユーザーによって渡されます。各SecurityContactはContactとの関係が1対1であるため、Hibernateはこのクエリの実行時に自動的に結合を呼び出します。しかし、Hibernateが常に実行する結合は内部結合であり、私の目的のためにはうまく動作しません。 Hibernateに内部的に左外部結合を生成させるような方法はありますか?Hibernate Left Outer Join

/** 
* The persistent class for the SecurityContact database table. 
* 
*/ 
@Entity 
@FXClass(kind=FXClassKind.REMOTE) 
public class SecurityContact implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Transient private String uid; 
    @FXIgnore 
    public String getUid() { 
     if (uid == null) { 
      uid = "" + securityContactId; 
     } 
     return uid; 
    } 

    public void setUid(String uid) { 
     this.uid = uid; 
    } 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="securityContact_id") 
    private Long securityContactId; 

    @Column(name="security_id") 
    private String securityId; 

    @Column(name="create_date") 
    private String createDate; 

    @Column(name="create_user") 
    private String createUser; 

    @Column(name="modify_date") 
    private String modifyDate; 

    @Column(name="modify_user") 
    private String modifyUser; 

    //bi-directional many-to-one association to AgentContact 

    @ManyToOne 
    @JoinColumn(name="agent_id", referencedColumnName="contact_id") 
    private AgentContact agentContact; 

    //bi-directional many-to-one association to AuditContact 
    @ManyToOne 
    @JoinColumn(name="audit_id", referencedColumnName="contact_id") 
    private AgentContact auditContact; 

    public SecurityContact() { 
    } 
    @FXKeyColumn 
    public Long getSecurityContactId() { 
     return this.securityContactId; 
    } 

    public void setSecurityContactId(Long securityContactId) { 
     this.securityContactId = securityContactId; 
    } 

    public String getSecurityId() { 
     return this.securityId; 
    } 

    public void setSecurityId(String securityId) { 
     this.securityId = securityId; 
    } 

    public String getCreateDate() { 
     return this.createDate; 
    } 

    public void setCreateDate(String createDate) { 
     this.createDate = createDate; 
    } 

    public String getCreateUser() { 
     return this.createUser; 
    } 

    public void setCreateUser(String createUser) { 
     this.createUser = createUser; 
    } 

    public String getModifyDate() { 
     return this.modifyDate; 
    } 

    public void setModifyDate(String modifyDate) { 
     this.modifyDate = modifyDate; 
    } 

    public String getModifyUser() { 
     return this.modifyUser; 
    } 

    public void setModifyUser(String modifyUser) { 
     this.modifyUser = modifyUser; 
    } 
    @FXManyToOne(parent="parent", property="contactId") 
    public AgentContact getAgentContact() { 
     return this.agentContact; 
    } 

    public void setAgentContact(AgentContact agentContact) { 
     this.agentContact = agentContact; 
    } 
    @FXManyToOne(parent="parent", property="contactId") 
    public AgentContact getAuditContact() { 
     return this.auditContact; 
    } 

    public void setAuditContact(AgentContact auditContact) { 
     this.auditContact = auditContact; 
    } 

} 
+0

マッピングファイルまたはアノテーションを投稿できますか? – dfb

答えて

2
+0

注釈@Fetch(FetchMode.SELECT)を含めることを意味しますか? –

+0

はい、それは私がそこに置いたドキュメントのXMLのアノテーションに相当します。 – dfb

+0

申し訳ありませんが、ちょうど確かなことですが、提供されたコードセグメントのどこに注釈を付けるのですか? –

0

がtrueにuse_outer_joinプロパティを設定参照多対一

の一致にfetch=selectを試してみてください:ここではSecurityContactクラスのコードです。

+0

これは効果がないようです。 –

1

Hibernateのドキュメントによれば、Hibernateクエリ言語はこれをサポートする必要があります。 (少なくともバージョン3.3で)このようなあなたのクエリを作成するには

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-joins

試してみてください。

Query query = entityManager.createQuery("Select sc from SecurityContact as sc " + 
             "left outer join sc.agentContact as c " + 
             "where sc.securityId=:securityId2"; 

EDIT:あなたはあなたの質問の詳細に供給agentContactプロパティにSCの接触性を変更します。

+0

私のクエリは次のように設定されています: "SecurityContact sc LEFT OUTER JOIN sc.agentContact ac WHERE sc.securityId =:securityId2"と設定すると、これは動作していないようです。 –

+0

選択にACを追加しようとすることができますか:「選択したSC、acからSecurityContact SC LEFT OUTER JOIN sc.agentContact ac WHERE sc.securityId =:securityId2」。結果は、結果を含むオブジェクト配列になります。 – david

+0

Hibernateはなんらかの理由でそのクエリを好きではありません。再コンパイル時にエラーが発生します。 –

1

関係: アカウントの多く - XML内の従業員1

設定を:

 <many-to-one name="employee" class="active.security.domain.Employee" lazy="false"> 
     <column name="EmpId" /> 
    </many-to-one> 

Javaコード:

 Session session = HibernateUtil.getCurrentSession(); 

    Criteria criteria = session.createCriteria(Account.class); 
    criteria.add(Restrictions.eq("application.id", applicationID)); 
    List<Account> list = criteria.list(); 

キーがcriteria.listを使用することです();

0

私は次のような構成だった:それはちょうどDBハックだったので、(代わりに私はなっていたINNER JOINの)USER_ID列がヌルではなかったが、私はLEFT OUTER JOINを望んでいた

<many-to-one column="user_id" lazy="proxy" fetch="join" insert="false" name="user" not-null="true" update="false" not-found="ignore" /> 

を - 時々user_id = 0ユーザーテーブルのどの行にもマッピングされていませんでした(NULLの代わりに0)。 fetch=selectモード

Hibernateの間隔で多くのデバッグをした後、not-null="false"を設定して私の問題を解決しました:)(私にはLEFT OUTER JOINがあります)。うまくいけば、誰かがそれが役に立つと思うでしょう(btw:私はHibernate 3.6.0.Finalを使用しています)。

0

私は同様の問題がありました。 私はSiebelUser DAOを持っていました。各SiebelUserは、多対1の関係を持つチームに関連しています。 一部のSiebelUserは、Usersテーブルに主キーが存在しない外部キーとしてuserid = 0を持っていました。当然、SeibelUsersテーブルからのフェッチでは、userd id = 0のユーザは無視されていました。 これは

<many-to-one name="teamid" class="com.hewitt.wlm.pojo.Tblteams"> <column name="TEAMID" length="4" not-null="true" /> </many-to-one>

ので、 は私の問題を解決するために私は設定を変更し、以前の設定でした。しかし、それは私にとってはうまくいかなかった。

<many-to-one name="teamid" class="com.hewitt.wlm.pojo.Tblteams" **fetch="join" not-null="false" lazy="proxy" not-found="ignore"**> <column name="TEAMID" length="4" not-null="**false**" /> </many-to-one>

最後に、私は明示的に左の外側を行うには、私のクエリを変更し、ユーザーテーブルにSiebelUsersからspecifcパスを与える。このように参加。

select property1, property2, ... 
from from **SiebelUser s left outer join s.team t** 
where property1='x' 

これは私に役立ちました。

私のSiebelUserクラスは、Teamオブジェクトをプロパティとして持っていたことに注意してください(上記のパスで定義されています)。 誰かを助けることを願っています。