【问题标题】:Query works in the console but not in the application查询在控制台中有效,但在应用程序中无效
【发布时间】:2015-06-21 15:43:39
【问题描述】:

我在 hibernate 4.0.1 中遇到本机查询问题。我有在数据库控制台中有效的查询,但在应用程序中无效。我有:

名为“case”的表有两列指向同一个表 - 名为“cost”的表,其中包含“value”列'。我的查询如下所示:

SELECT COUNT(*), a.value, b.value, ...
FROM case AS c
LEFT JOIN cost AS a ON c.fist_cost_id = a.id
LEFT JOIN cost AS b ON c.second_cost_id = b.id
...
GROUP BY a.value, b.value, ...

查询实际上要复杂得多,但我认为这并不重要,所以我放了点。正如我在数据库控制台中编写此查询工作但在应用程序中引发错误:

原因: org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: 在自动发现 a 期间遇到重复的 sql 别名 [value] 本机 sql 查询位于 org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:594) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.loader.Loader.getResultSet(Loader.java:1986) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.loader.Loader.doQuery(Loader.java:829) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.loader.Loader.doList(Loader.java:2463) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.loader.Loader.doList(Loader.java:2449) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2279) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.loader.Loader.list(Loader.java:2274) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:331) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1585) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:224) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 在 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:252) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final] ... 138 更多

您知道如何解决它吗?

[编辑]

有人提到“值”不是列的正确名称。确实如此,事实上该列并未命名为“值”,但有点不同。我的严格合同禁止发布任何关于代码的信息。我必须尽可能地解释它,所以我在 fly 中重命名了所有变量,并没有认为“值”是错误的词。所以列没有命名为“值”,但其余列仍然适用。

【问题讨论】:

  • value 不是 SQL 保留字吗?

标签: java sql hibernate jpa


【解决方案1】:

value 是保留字,所以你有问题。您需要重命名列。

【讨论】:

  • 或者用`符号包裹列名:a.`value`, b.`value`
  • @LuiggiMendoza 我不认为它会起作用,jpql 查询中的 a.value 是属性字段(值)的名称,然后映射到 db 列“值”,所以 a.@987654322 @ 不应该解析(但我还没有尝试过)
  • 您可以在列映射中而不是在查询中执行此操作。
【解决方案2】:

您必须添加别名以避免重复:

SELECT COUNT(*), a.value AS value0, b.value AS value1, ...

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多