【问题标题】:HQL throws exception when adding an OR statement添加 OR 语句时 HQL 抛出异常
【发布时间】:2015-07-19 02:19:13
【问题描述】:

我有以下 HQL:

select r from Route r where r.startingStop.description = 'Railway Station'

现在,我已将 HQL 修改为:

select r from Route r where r.startingStop.description = 'Railway Station' or r.destinationStop.description = 'Railway Station'

我得到以下异常:

org.hibernate.exception.DataException: Subquery returns more than 1 row

我已经在 Stackoverflow 上研究过这个异常,但我仍然无法解决我的问题。提前致谢。

我的字段(单向映射):

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "starting_stop")
private BusStop startingStop;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "destination_stop")
private BusStop destinationStop;

【问题讨论】:

  • 您将其用作子查询还是整个查询?
  • 我怀疑这个查询是否是引发该异常的查询。发布完整的堆栈跟踪和相关代码(即引发此异常的代码)。
  • 这是完整的查询
  • 如果您只想从数据库返回单个结果,请使用 LIMIT 1 就像 select r from Route r where r.startingStop.description = 'Railway Station' or r.destinationStop.description = 'Railway Station' LIMIT 1 一样
  • 首先,不,我不想要一个结果。其次,LIMIT 从未被 HQL 支持

标签: java hibernate orm hql


【解决方案1】:

查询工作正常,但问题是它返回超过 1 行。您尝试将结果用作 1 个对象,但使用 or 子句它返回多个并引发异常。 例如,如果您将其用作子查询并且您说:

Something =(您的查询)它将失败,因为您的查询返回 2 个结果。

如果您尝试将其映射到单个对象,这也会是一个问题,因为您会得到多个结果。

【讨论】:

    【解决方案2】:

    只要我们不知道您想要的选择或输出,这里有一些提示,将指导您解决问题。

    原因:外部查询必须使用关键字ANYALLINNOT IN 之一来指定要比较的值,因为子查询返回更多超过一排

    操作:使用ANYALLINNOT IN 指定要比较或改写查询的值,以便只检索一行。

    建议:如果您关心列表中的值或确保它们相同,请尝试将和rownum=1 添加到您的子查询条件中。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      相关资源
      最近更新 更多