2011-08-01 145 views
6

我有一個Hibernate服務方法,如:"SELECT sc FROM SecurityContact sc WHERE sc.securityId=:securityId2"。 securityId2由用戶傳入。每個SecurityContact與Contact有多對一的關係,所以當這個查詢運行時,Hibernate會自動調用一個連接。但是,Hibernate始終運行的連接是內部連接,對於我的目的而言,這將無法正常工作。有什麼辦法強制Hibernate內部生成一個左外連接嗎?下面是SecurityContact類的代碼:休眠左外連接

/** 
* 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

回答

0

在Hibernate CONFIGS的use_outer_join屬性設置爲true。

+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"; 

編輯:改變SC的接觸性給你在你的問題的詳細信息提供的agentContact財產。

+0

我的查詢設置爲:「SELECT sc FROM SecurityContact sc LEFT OUTER JOIN sc.agentContact ac WHERE sc.securityId =:securityId2」,這似乎不起作用。 –

+0

您可以嘗試將ac添加到select:「SELECT sc,ac從SecurityContact sc LEFT OUTER JOIN sc.agentContact ac WHERE sc.securityId =:securityId2」。結果將是一個包含結果的對象數組。 – david

+0

由於某種原因,Hibernate不喜歡那個查詢。它在重新編譯時會拋出錯誤。 –

1

關係: 帳戶許多 - 僱員一個

在XML配置:

 <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

我有以下配置:

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

user_id列不是空的,但我想一個LEFT OUTER JOIN(而不是INNER JOIN我得到),因爲它只是一個DB黑客 - 有時user_id = 0它沒有映射到用戶表中的任何行(0代替NULL)。我不想fetch=select模式

在休眠間隔我設置not-null="false"它解決了這個問題對我來說是很大的調試之後:)(我得到了LEFT OUTER JOIN)。希望有人會覺得它有用(順便說一句:我使用Hibernate 3.6.0.Final)。

0

我有類似的問題。 我有一個SiebelUser DAO。每個SiebelUser都與一個擁有多對一關係的團隊相關。 某些SiebelUser具有userid = 0作爲外鍵,在Users表中沒有主鍵。所以自然從SeibelUsers表中取回是忽略用戶id = 0的用戶。 這是以前的配置

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

所以, 爲了解決我的問題,我改變了config來。但它不適合我。

<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對象作爲其屬性(如上面的路徑中所定義的)。 希望它可以幫助別人。