【问题标题】:Problem with generated SQL from Hibernate (MS SQLServer)从 Hibernate (MS SQLServer) 生成的 SQL 出现问题
【发布时间】:2011-04-26 21:22:47
【问题描述】:

我在使用 Hibernate 生成一个不能在 SQLServer 上运行的 SQL 时遇到问题(在 PostgreSQL 上运行没有任何问题)。我尝试为 SQLServer 设置休眠方言,但仍然生成相同的 SQL 并且仍然不起作用。 HQL 查询如下所示:

 select count(t) from ValidationLog t

生成的 SQL 如下所示:

 select count((vl.dataKey, vl.dataType)) from ValidationLog vl;

所以我的问题是它周围是否有任何东西?真的很想为两个数据库使用相同的代码。

【问题讨论】:

    标签: sql-server hibernate orm jpa


    【解决方案1】:

    根据 JPA 规范,您的 JPQL 查询完全有效

    4.8 SELECT 子句

    ...

    SELECT 子句有以下内容 语法:

    select_clause ::= SELECT [DISTINCT] select_expression {, select_expression}*
    选择表达式 ::=
         单值路径表达式 |
         聚合表达式 |
         识别变量 |
         对象(标识变量)|
         构造函数表达式
    构造函数表达式 ::=
         新的constructor_name(constructor_item {,constructor_item}*)
    constructor_item ::= single_valued_pa​​th_expression |聚合表达式
    聚合表达式 ::=
         { 平均 |最大 |最小 | SUM } ([DISTINCT] state_field_path_expression) |
         COUNT ([DISTINCT] Identification_variable | state_field_path_expression |
              单值关联路径表达式)
    

    但是,您可能是 HHH-4044HHH-3096HHH-2266(甚至是 HHH-5419)等问题中报告的错误的受害者。

    可能的解决方法:使用 state_field_path_expression

    select count(t.someField) from ValidationLog t
    

    【讨论】:

    • 但是 SQL Server 不会识别出 SQL,因为 t-sql 没有这种能力。
    • @HLGEM 什么 SQL?当前生成的?如果是,那么我同意这是不正确的,这正是问题所在(根据规范,来自 OP 的 JPQL 查询是正确的,由 JPA 提供程序来生成适当的 SQL)。
    【解决方案2】:

    HQL 在我看来是错误的,应该是:

    select count(t.dataKey) from ValidationLog t
    

    【讨论】:

    • 不,它是表中的复合键,因此必须至少有两列。
    • 你要数什么?行数还是不同的复合键?
    • 表格中的行数是我想要计算的。这应该与不同复合键的数量相同。
    • 在这种情况下,我的答案仍然有效。
    猜你喜欢
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多