休眠 2 与 MSSQL 用于 ORDER BY

Posted

技术标签:

【中文标题】休眠 2 与 MSSQL 用于 ORDER BY【英文标题】:Hibernate 2 with MSSQL for ORDER BY 【发布时间】:2015-07-21 09:08:27 【问题描述】:

我一直在使用 Oracle 和 Postgre,最近切换到 MS SQL 2012。 我在我的应用程序中以及在任何地方使用了按标准排序的地方都使用了休眠:

(criteria.addOrder(Order.asc("applicationId"))); 

它会导致错误提示:

聚合函数不起作用。

一旦我评论说我的程序工作正常并且可以检索数据。

我正在使用 Hibernate 3。

有没有什么方法可以通过hibernate订购它而不会出现这个错误?

编辑..

这是我遇到的一个错误,

“SKY.tcrent.RENTNO”列在 ORDER BY 子句中无效,因为 它不包含在聚合函数或 GROUP BY 中 子句。

编辑 2..

我的查询

  Query tcSchaduleQ = getSession().createQuery("SELECT SUM(tcs.dueAmount) FROM TrialCalculationSchedule tcs WHERE tcs.facilityId=:facilityId AND tcs.rentalNumber>:rentalNumber AND tcs.dueDate>:dueDate AND dueTypeId IN(:dueTypeId) ORDER BY tcs.rentalNumber ").setInteger("rentalNumber", facility.getPeriod() - noOfprePayments).setInteger("facilityId",facility.getFacilityId()).setDate("dueDate", date).setParameterList("dueTypeId", plist);

  Number tcsAmt = (Number) tcSchaduleQ.uniqueResult();

这就是 hibernate 在 HQL 中生成的内容

SELECT
    SUM(tcs.dueAmount) 
FROM
    TrialCalculationSchedule tcs 
WHERE
    tcs.facilityId=:facilityId 
    AND tcs.rentalNumber>:rentalNumber 
    AND tcs.dueDate>:dueDate 
    AND dueTypeId IN(
        :dueTypeId
    ) 
ORDER BY
    tcs.rentalNumber

这是 SQL

select
        SUM(trialcalcu0_.DUEAMT) as col_0_0_ 
    from
        SKYBANKSLFHP.tcrent trialcalcu0_ 
    where
        trialcalcu0_.FACID=? 
        and trialcalcu0_.RENTNO>? 
        and trialcalcu0_.DUEDATE>? 
        and (
            trialcalcu0_.DUETYPEID in (
                ? , ?
            )
        ) 
    order by
        trialcalcu0_.RENTNO

【问题讨论】:

你能发布更多的源代码吗? ORDER BY 本身不是聚合函数(SUM、COUNT 等是)。 见forum.hibernate.org/viewtopic.php?p=2436442 投票否决,因为您所要求的(关于标准 API)与您的代码 (HQL) 不匹配,还声称正在发生两个不同的错误消息。 【参考方案1】:

看起来你混合了聚合和非聚合表达式。如果你在 Select 查询中使用任何聚合函数,如 AVG() 和其他一些非聚合,那么你必须使用 Group By ..

试试这样的

createQuery("SELECT SUM(tcs.dueAmount) As DueAmount  ...

如果你使用的是 Criteria 那么它应该是这样的

  Criteria crit = sess.createCriteria(Insurance.class);
  ProjectionList proList = Projections.projectionList();
  proList.add(Projections.sum("investementAmount"));
  crit.setProjection(proList);
  List sumResult = crit.list();

【讨论】:

我已经编辑了问题请看最后几行 您的查询在哪里?也请分享一下 再次编辑。请检查 在你的条件查询中给SUM(tcs.dueAmount)一些名字不要直接使用它也你告诉你正在使用条件但在这里你使用createQuery 喜欢,“总和(tcs.dueAmount)作为总和”?

以上是关于休眠 2 与 MSSQL 用于 ORDER BY的主要内容,如果未能解决你的问题,请参考以下文章

MSSQL 分组后取每组第一条(group by order by)

详解基于MSSQL “order by”语句报错的SQL注入技术

SQL里面的order by语句是干啥用的?

存储过程 - 在 ORDER BY 列表位置 2 中遇到常量表达式

order by 和 group by 的区别?

sql中order by和group by的区别