首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将内连接和左连接与JPQL和HQL结合起来

如何将内连接和左连接与JPQL和HQL结合起来
EN

Stack Overflow用户
提问于 2015-03-17 12:56:57
回答 1查看 5.5K关注 0票数 1

我正在尝试实现一个HQL查询。我已经能够在SQL中实现它--我对它比较熟悉。我一直纠结于内部连接。

这些类是这样实现的……

代码语言:javascript
复制
class Item

class Component extends Item
    private Item parentItem;

class Assembly extends Item 

到目前为止,这就是我为HQL准备的。

代码语言:javascript
复制
SELECT
item.blah,
comp.blah,
assembly.blah
FROM
Component comp
LEFT OUTER JOIN comp.parentItem item,
Assembly assembly
WHERE 
item.parentItem = assembly

这是可行的-除了我需要最后三行是一个左外连接而不是一个互斥的条件。我尝试过以多种方式实现这一点--但我总是遇到映射问题。

代码语言:javascript
复制
<hibernate-mapping>
    <class lazy="false" name="com.kcp.common.domain.inventory.Item"
   table="W_INV_INV_ITEM" where="deleted=0">

       <joined-subclass lazy="false" name="com.kcp.common.domain.inventory.Component" table="W_INV_INV_COMPONENT">
         <key>
           <column name="ID">
               <comment>Primary and foreign key to W_INV_INV_ITEM.</comment>
            </column>
         </key>
         <many-to-one cascade="all" class="com.kcp.common.domain.inventory.Item" name="parentItem" outer-join="true">
              <column name="PARENT_ITEM_ID">
                <comment>Foreign key identifying the item to which this component is assembled.</comment>
              </column>
         </many-to-one>
       </joined-subclass>

        <joined-subclass lazy="false" name="com.kcp.common.domain.inventory.Assembly" table="W_INV_INV_MAJOR_ASSEMBLY">   
          <key>
            <column name="ID">
              <comment>Primary and foreign key to W_INV_INV_ITEM.</comment>
            </column>
          </key>
    </class>
 </hibernate-mapping>

还有-我让它在SQL中工作,就像这样...

代码语言:javascript
复制
FROM
DBO.W_INV_INV_ITEM item
INNER JOIN DBO.W_INV_INV_COMPONENT comp ON item.id = comp.id
LEFT OUTER JOIN DBO.W_INV_INV_ITEM parentInv ON comp.PARENT_ITEM_ID = parentInv.id
LEFT OUTER JOIN DBO.W_INV_INV_MAJOR_ASSEMBLY parentMA ON comp.PARENT_ITEM_ID = parentMA.id
EN

回答 1

Stack Overflow用户

发布于 2015-03-17 15:10:16

如果在WHERE子句中包含左联接条件,它将充当内联接。

如果item是可选的,那么item.parentItem也必须是可选的,所以您需要将其包含在左连接中。

尝试如下所示:

代码语言:javascript
复制
SELECT
    i.blah,
    c.blah
FROM Component c
LEFT JOIN c.parentItem i
LEFT JOIN i.parentItem p
WHERE 
    p is null or p.class = 'Assembly'
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29091566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档