繁体   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