1

我正在尝试将此 SQL 转换为 HQL,但我发现无法执行左连接。

SELECT
    mdcs_causa.id_causa,
    usuarios.ds_usuario,
    usuarios.setor,
    empresas.ds_empresa,
    itens_controle.id_item_controle,
    itens_controle.ds_item,
    itens_controle.ds_indicador,
    itens_controle.ds_cliente,
    itens_controle.desdobramento,
    itens_controle.auxiliar,
    itens_controle.bmk_nome,
    itens_controle.bmk_vlr,
    m.status,
    m.medido,
    m.medicao,
    m.fca,
    m.am_cronico,
    m.ac_cronico,
    m.ap_cronico,
    m.id_medicoes as idmedicao,
    itens_controle.prioridade
FROM
    mdcs
    INNER JOIN mdcs_causa 
        ON mdcs.id_mdc = mdcs_causa.id_mdc
    INNER JOIN itens_controle
        ON mdcs_causa.Id_Item_Controle = itens_controle.id_item_controle
    INNER JOIN usuarios
        ON usuarios.id_usuario = itens_controle.id_usuario
    INNER JOIN empresas 
        ON empresas.id_empresa = usuarios.id_cliente_tabela
    LEFT JOIN medicoes m 
        ON (
            itens_controle.id_item_controle = m.id_item_controle
            and
            m.nm_ano = 2013 
            and 
            m.nm_periodo = 2 
            and 
            mdcs_causa.id_mdc = mdcs.id_mdc
        )
    WHERE
        mdcs.id_mdc = 5077

我想我可以将nm_anoandnm_periodo条件放在 where 子句中,并带有一个 OR,m.id_item_controle is null但这个 OR 条件似乎不起作用,即使在 SQL 中也是如此。

另一种方法是左连接子查询。这在 SQL 中有效,但我认为 HQL 不支持它。

4

2 回答 2

2

可以用with关键字来完成:

... 
left join itens_controle.medicoes m with (m.nm_ano = 2013 and m.nm_periodo = 2 and mdcs_causa.id_mdc = mdcs.id_mdc)
where mdcs.id_mdc = 5077

您应该将它们作为参数提供,而不是显式值。

于 2013-03-20T13:36:27.340 回答
0

在这个pdf中阅读这个左连接使用 如下:

Query getEBills =session.createQuery( session.createQuery( from " EBill ebill EBill
ebill
left join ebill.accountTransaction where
ebill.balance > 500";
Li li f l bi i li () ist listOfRowValues = getDebitTransactions.list();
for (Object[] singleRowValues : listOfRowValues) {
// pull off the EBill // pull off the EBill
EBill ebill = (EBill)singleRowValues[0];

我在 HQL 方面没有任何经验,我已经粘贴了我为您找到的内容。希望这会对您有所帮助。

于 2013-03-20T14:02:36.920 回答