【问题标题】:Query with DISTINCT clause still returning the same value twice使用 DISTINCT 子句的查询仍然返回相同的值两次
【发布时间】:2015-05-28 23:15:55
【问题描述】:

我正在使用 Oracle 11g XE,但以下 HQL 未按预期工作。由于某种原因,它仍然两次返回相同的值。

@Query("SELECT y FROM Oferta y, ClassificacaoOfertaBanco c 
        LEFT JOIN c.oferta 
        LEFT JOIN c.banco WHERE y.id IN 
        (SELECT DISTINCT (o.id) FROM Oferta o 
         JOIN o.empresas e WHERE o.id NOT IN 
         (SELECT black.id FROM Banco b 
          JOIN b.blackList black WHERE b.id = ?1) AND o.dataRemocao IS NULL) 
          ORDER BY CASE c.classificacao WHEN NULL THEN y.classificacao ELSE 
          c.classificacao END DESC, y.divulgacaoDe DESC")

我在子查询中使用 distinct,因为我的 Oferta 对象有一些 Lob 字段,而 Oracle 不允许对它们进行 distinct。

有人可以帮帮我吗?

编辑: 经过几次测试,我确定发生这种情况的原因是我从 2 个表中进行选择。不过还是不知道怎么解决。

【问题讨论】:

  • DISTINCT 出现在IN 运算符之后的子查询中。没用,因为a IN (1, 2)a IN (1, 1, 2) 一样。
  • 其实这让我很困惑。我在 IN 子句中还有其他几个带有 DISTINCT 的查询,它按预期工作。此查询与其他查询之间的唯一区别是我从 2 个表中选择的这个。
  • 你的意思是SELECT DISTINC y FROM Oferta y, ...
  • 我编辑了之前的评论,但是由于对象内部的 Lob 字段,SELECT DISTINCT y FROM Oferta y不会工作。
  • DISTINCTROW 不是有效的 HQL 值

标签: java spring oracle hibernate


【解决方案1】:

也许你想要的是这样的:

@Query("SELECT c.oferta FROM ClassificacaoOfertaBanco c
        LEFT JOIN c.oferta 
        LEFT JOIN c.banco WHERE c.oferta.id IN 
        (SELECT DISTINCT (o.id) FROM Oferta o 
         JOIN o.empresas e WHERE o.id NOT IN 
         (SELECT black.id FROM Banco b 
          JOIN b.blackList black WHERE b.id = ?1) AND o.dataRemocao IS NULL) 
          ORDER BY CASE c.classificacao WHEN NULL THEN c.oferta.classificacao ELSE 
          c.classificacao END DESC, c.oferta.divulgacaoDe DESC")

我没有对此进行测试,也没有您的数据模型,但我们的想法是从单个基表或实体中进行选择并遵循关系。

【讨论】:

  • 你走在正确的轨道上。按照你的想法并使用一些双向关系,我得到了查询。
猜你喜欢
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2017-06-09
  • 2014-12-18
  • 2013-08-30
相关资源
最近更新 更多