【问题标题】:HQL Left Outer Join for null column in one-to-one relation一对一关系中空列的HQL左外连接
【发布时间】:2013-01-23 12:18:39
【问题描述】:

无论B表是否有匹配记录,左外连接都应该从左表获取所有数据,但是如果左表right_id列为空,则无法获取记录。

我在解释更多

在数据模型中:Order.java,是我的LEFT表,是一对一的关系

@OneToOne(targetEntity = OrderShippingDetail.class, optional=true, cascade = {CascadeType.ALL})
@JoinColumn(name = "SHIPPING_DETAIL_ID", referencedColumnName = "ID")
private OrderShippingDetail shippingDetail;

HQL 是:

    hql = "SELECT " +
            "o.id as id, " +
            "o.createTime as createTime, " +
            "o.customerEmailAddress as customerEmailAddress, " +
            "o.customerPhoneNumber as customerPhoneNumber, " +
            "o.customerNote as customerNote, " +
            "o.invoicePrintedFlag as invoicePrintedFlag, " +
            "shippingAddress.address.personName as shippingPersonName, " +
            "shippingDetail.shippingCompany.id as shippingCompanyId, "+
            "shippingDetail.shippingCompany.name as shippingCompanyName, "+
            "shippingDetail.receiptNumber as shippingReceiptNumber, "+
            "shippingDetail.trackingNumber as shippingTrackingNumber, "+
            "shippingDetail.price as shippingPrice, "+
            "o.invoiceNumber as invoiceNumber " + 
        "FROM Order AS o " +
        "LEFT OUTER JOIN o.shippingAddress AS shippingAddress " +
        "LEFT OUTER JOIN o.shippingDetail AS shippingDetail ";

但是只有“SHIPPING_DETAIL_ID”不为空的记录。 HQL 有错误吗?它是通过建模 SQL 命令创建的,该命令是在 hibernate 运行时自动创建的。

我找到了,

HQL 支持两种形式的关联加入:隐式和显式。

上一节中显示的查询都使用显式形式, 也就是说,在 from 子句中显式使用了 join 关键字。 这是推荐的形式。

隐式形式不使用 join 关键字。相反, 使用点符号“取消引用”关联。隐式连接可以 出现在任何 HQL 子句中。隐式连接导致内部连接 在生成的 SQL 语句中。

我删除了 SELECT 部分中的点符号,所以我的新 HQL:

hql = "SELECT " +
                "o.id as id, " +
                "o.createTime as createTime, " +
                "o.customerEmailAddress as customerEmailAddress, " +
                "o.customerPhoneNumber as customerPhoneNumber, " +
                "o.customerNote as customerNote, " +
                "o.invoicePrintedFlag as invoicePrintedFlag, " +
                "shippingDetail, " +
                "o.invoiceNumber as invoiceNumber " + 
            "FROM Order AS o " +
            "LEFT OUTER JOIN o.shippingAddress AS shippingAddress " +
            "LEFT OUTER JOIN o.shippingDetail AS shippingDetail ";

所以,它有效,它返回 Order 表中的所有记录,但是,我不想选择 ShippingDetail 对象中的所有列和关系。我该怎么做才能解决这个问题?

【问题讨论】:

    标签: java hibernate hql left-join


    【解决方案1】:

    在查询中添加另一个显式左连接:

    SELECT o.id as id, 
    ...,
    shippingCompany.id as shippingCompanyId, 
    shippingCompany.name as shippingCompanyName, 
    ...
    FROM Order AS o
    LEFT OUTER JOIN o.shippingAddress AS shippingAddress 
    LEFT OUTER JOIN o.shippingDetail AS shippingDetail
    LEFT OUTER JOIN shippingDetail.shippingCompany AS shippingCompany
    

    【讨论】:

    • 我应该得到它! shippingDetail.shippingCompany.id as shippingCompanyId 第一个点用于LEFT OUTER JOIN o.shippingDetail AS shippingDetail,根据 Hibernate 文档,第二个点导致 INNER JOIN。谢谢...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2012-06-03
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多