【问题标题】:From SQL to HQL Join and Delete从 SQL 到 HQL 加入和删除
【发布时间】:2018-08-19 05:08:48
【问题描述】:

让这个 SQL 查询像魅力一样工作,想将其转换为 HQL,但有一些困难。

SQL 查询:

DELETE med1
FROM MEDECINES med1, MEDECINES med2
WHERE (
    REPLACE(med1.`MEDECINE_ID`, ' ', '') < REPLACE(med2.`MEDECINE_ID`, ' ', '') AND 
    REPLACE(med1.`MEDECINE_DCI`, ' ', '') = REPLACE(med2.`MEDECINE_DCI`, ' ', '') AND 
    REPLACE(med1.`MEDECINE_MARK`, ' ', '') = REPLACE(med2.`MEDECINE_MARK`, ' ', '') AND 
    REPLACE(med1.`MEDECINE_FORM`, ' ', '') = REPLACE(med2.`MEDECINE_FORM`, ' ', '') AND 
    REPLACE(med1.`MEDECINE_DOSAGE`, ' ', '') = REPLACE(med2.`MEDECINE_DOSAGE`, ' ', '') AND 
    med1.`MEDECINE_REDEEMABILITY` = med2.`MEDECINE_REDEEMABILITY`
);

HQL(我现在能写的):

DELETE FROM Medecine med1
        WHERE EXISTS (
           FROM Medecine med2
           WHERE(
                med1.medecineId < med2.medecineId AND
                REPLACE(med1.medecineDci, ' ', '') = REPLACE(med2.medecineDci, ' ', '') AND
                REPLACE(med1.medecineMark, ' ', '') = REPLACE(med2.medecineMark, ' ', '') AND
                REPLACE(med1.medecineForm, ' ', '') = REPLACE(med2.medecineForm, ' ', '') AND
                REPLACE(med1.medecineDosage, ' ', '') = REPLACE(med2.medecineDosage, ' ', '') AND
                med1.medecineRedeemability = med2.medecineRedeemability
            )
        )

【问题讨论】:

    标签: mysql sql database hibernate hql


    【解决方案1】:

    使用EXISTS

    DELETE FROM medecines med1
    WHERE  EXISTS (SELECT 1
                   FROM   medecines med2
                   WHERE  REPLACE(med1.medecine_id, ' ', '') <
                          REPLACE(med2.medecine_id, ' ', '')
                          AND REPLACE(med1.medecine_dci, ' ', '') =
                              REPLACE(med2.medecine_dci, ' ', '')
                          AND REPLACE(med1.medecine_mark, ' ', '') =
                              REPLACE(med2.medecine_mark, ' ', '')
                          AND REPLACE(med1.medecine_form, ' ', '') =
                              REPLACE(med2.medecine_form, ' ', '')
                          AND REPLACE(med1.medecine_dosage, ' ', '') =
                              REPLACE(med2.medecine_dosage, ' ', '')
                          AND med1.medecine_redeemability =
                              med2.medecine_redeemability ); 
    

    【讨论】:

    • 按照你的建议做了,这里是输出:java.sql.SQLException: 表 'MEDECINES' 被指定了两次,既作为 'DELETE' 的目标,又作为数据的单独源,抱歉迟到了回答
    • @Mouley :在您的最终查询中删除 select 1 后尝试。
    • 抱歉没听明白,你的意思是我必须写两个查询或者...?
    • @Mouley :我的意思是说你在作为“FROM medecines”存在之后开始子查询:检查这个stackoverflow.com/questions/3672444/…
    • 我编辑了主题以发布我的新 HQL,请查看
    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多