休眠左外连接

时间:2011-08-01 21:17:09

标签: java hibernate

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

} 

6 个答案:

答案 0 :(得分:2)

答案 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对象作为其属性(如上面的路径中所定义)。 希望它可以帮到某人。