簡體   English   中英

休眠左外連接

[英]Hibernate Left Outer Join

我有一個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;
    }

} 

關系:賬戶多 - 員工一

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();

根據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屬性。

我有以下配置:

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

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

經過Hibernate間隔的大量調試后,我設置了not-null="false" ,這解決了我的問題:)(我得到了LEFT OUTER JOIN )。 希望有人會覺得它很有用(順便說一下:我正在使用Hibernate 3.6.0.Final)。

我遇到了類似的問題。 我有一台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>

所以,為了解決我的問題,我將配置更改為。 但它對我不起作用。

<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到Users表的特定路徑。

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

這對我有用。

請注意,我的SiebelUser類將Team對象作為其屬性(如上面的路徑中所定義)。 希望它可以幫助某人。

在你的hibernate配置中,將use_outer_join屬性設置為true。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM