[英]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.