【问题标题】:Invalid query on a HQL join query with proper syntax使用正确语法的 HQL 连接查询的无效查询
【发布时间】:2017-11-15 14:36:16
【问题描述】:

我有如下 HQL 连接查询

SELECT first FROM FirstTable AS first, SecondTable AS second WHERE second.firstTable = first;

以上查询返回无效查询。但是,如果我在没有SELECT first 的情况下使用相同的上述查询,则它工作得非常好。我正在使用文档中的正确语法。关于我可能遗漏的错误或任何修复的任何想法?我正在使用 Grails Dynamic finders 来运行 HQL,即,

FirstTable.findAll(hql.toString(),params)

hql 是一个字符串构建器,我使用它来构建带有所有必需参数的查询 (param)。

我得到的完整错误如下

org.codehaus.groovy.grails.orm.hibernate.exceptions.GrailsQueryException:无效查询 [SELECT first FROM FirstTable AS first, SecondTable AS second WHERE second.firstTable = first group by first.id order by first.id]域类 [class com.model.FirstTable]

FirstTable 有一个OneToMany 映射到SecondTableSecondtable 有一个OneToOne 映射到FirstTable

【问题讨论】:

  • 先尝试删除 as。先只写FirstTable。与第二个相同
  • @XavierBouclet 我认为这不会有什么不同。无论如何,我确实尝试过它仍然有同样的错误。
  • 尝试使用类似 second.firstTable.id = first.id 的 id。能否添加 FirstTable 和 SecondTable 的映射?
  • 您是否尝试将其更改为 SELECT second.firstTable?
  • @RobObdeijn 是的,我有,但仍然是同样的错误。

标签: hibernate grails grails-orm


【解决方案1】:

就像你说的,当你先删除 SELECT 时它会起作用。因为 findAll 方法只负责像“from FirstTable”这样的查询。 建议改用executeQuery。

在你的情况下,它会是这样的:

FirstTable.executeQuery("from FirstTable AS first, SecondTable AS second WHERE second.firstTable = first");

查看这些链接了解更多详情:issues1428duplicate so

【讨论】:

    【解决方案2】:

    您正在尝试选择整个表格作为一列,也许您应该尝试以下操作:

      SELECT * FROM FirstTable AS first, SecondTable AS second WHERE second.firstTable = first;
    

    【讨论】:

    • 它仍然给出相同的错误,我认为在进行连接时在 HQL 中不允许使用 *。我们必须指定我们需要显示的表的别名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多