Java 一对一关系中null列的HQL左外部联接
不管B表中是否有匹配的记录,左外部联接都应该从左表中获取所有数据,但如果左表右id列为空,则无法获取记录 我在解释更多 在数据模型Order.java中,它是我的左表,有一对一的关系Java 一对一关系中null列的HQL左外部联接,java,hibernate,hql,left-join,Java,Hibernate,Hql,Left Join,不管B表中是否有匹配的记录,左外部联接都应该从左表中获取所有数据,但如果左表右id列为空,则无法获取记录 我在解释更多 在数据模型Order.java中,它是我的左表,有一对一的关系 @OneToOne(targetEntity = OrderShippingDetail.class, optional=true, cascade = {CascadeType.ALL}) @JoinColumn(name = "SHIPPING_DETAIL_ID", referencedColumnName
@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\u DETAIL\u 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对象中的所有列和关系。如何解决此问题?向查询中添加另一个显式左连接:
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作为shippingCompanyId第一个点代表
左外部联接o.shippingDetail作为shippingDetail
,第二个点根据Hibernate文档导致内部联接。谢谢