【问题标题】:Hibernate (or EntityManager?) adding "where 0=1" to queryHibernate(或 EntityManager?)添加“where 0=1”进行查询
【发布时间】:2013-06-06 22:05:46
【问题描述】:

我正在使用 JPA EntityManager + Hiberate,并且出现了一个神秘的 where 子句。 Hibernate 的调试基本上显示:

select /* bunch of columns */
from some_table
where /* several filters */
  and 0=1

运行javax.persistence.Query.getResultList 时会发生这种情况。 Query 在其 where 子句中有一个 Predicates 数组,但请放心,0 = 1 不是其中之一。

我找不到0=1 部分包含在查询中的可能原因。有任何想法吗?我会先搜索答案,但搜索引擎会忽略=

【问题讨论】:

    标签: hibernate jpa entitymanager


    【解决方案1】:

    这就是将析取转换为 SQL 的方式。见javadoc for disjunction()

    创建一个析取(零析取)。零析取的析取是假的。

    因此,当创建空析取时,它只包含子句1 = 0 (false)。当额外的谓词被添加到析取时,它们只是简单地添加到初始(假)谓词中,用or分隔:

    where 1 = 0 or ...
    

    如果你使用连词,它会被翻译成

    where 1 = 1 and ...
    

    【讨论】:

    • 宾果游戏。我刚刚调试了创建谓词的代码,发现它构建了一个没有任何内容的析取。问题解决了。谢谢!
    【解决方案2】:

    类似于@JB Nizet 的答案,但要使其更具体。就我而言,我使用的是 CriteriaBuilder,问题是我正在以编程方式创建谓词列表。在某些情况下,它会生成一个空的谓词列表,当我应用时:

    criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[] {})));
    

    出现0=1 问题。只需检查谓词列表是否为空,并避免在 where 子句为空的情况下添加,即可解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多