我有一个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 :(得分:2)
在多对一匹配
上尝试fetch=select
另见http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies和http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html
答案 1 :(得分: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属性。
答案 2 :(得分: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();
答案 3 :(得分:0)
在你的hibernate配置中,将use_outer_join属性设置为true。
答案 4 :(得分: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列不是null,但我想要LEFT OUTER JOIN
(而不是我得到的INNER JOIN
),因为它只是一个数据库黑客 - 有时是user_id = 0
#39; t映射到用户表中的任何行(0表示替换为NULL)。我不想要fetch=select
模式
在Hibernate间隔进行了大量调试后,我设置了not-null="false"
,这解决了我的问题:)(我得到了LEFT OUTER JOIN
)。希望有人会发现它很有用(顺便说一下:我使用的是Hibernate 3.6.0.Final)。
答案 5 :(得分: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>
所以, 为了解决我的问题,我将配置更改为。但它对我不起作用。
<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对象作为其属性(如上面的路径中所定义)。 希望它可以帮到某人。