当前位置: 首页 > 知识库问答 >
问题:

具有聚合函数的Hibernate命名查询

贺浩漫
2023-03-14

我试图在Hibernate中执行命名查询。查询在此映射文件中定义

<?xml version="1.0"?>
<class name="MxePosition" table="MY_TABLE">
    <id name="id" column="MY_ID" />
    <property name="quantity" />
    <property name="instrument" />
</class>

<sql-query name="getPositionsForPortfolio">
    <return alias="position" class="com.example.domain.MxePosition"/>
    <![CDATA[
        SELECT 
        SUM(LEG_ONE_NOMINAL) AS {position.quantity}, 
        ID_INSTRUMENT AS {position.instrument} 
        FROM MY_TABLE WHERE SRC_PORTFOLIO= :portfolio GROUP BY ID_INSTRUMENT
    ]]>
</sql-query>

MxePosition类如下:

public class MxePosition {

private Long id;
private String instrument;
private double quantity;

public String getInstrument() {
    return instrument;
}
public void setInstrument(String instrument) {
    this.instrument = instrument;
}
public double getQuantity() {
    return quantity;
}
public void setQuantity(double quantity) {
    this.quantity = quantity;
}
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
}

我试图做的是让命名查询返回由另一列分组的一列的总和。然而,Hibernate抛出了一个错误,我怀疑这是因为查询结果不包含ID列。

18:06:44,728 ERROR JDBCExceptionReporter:101 - Column not found: MY1_1_0_

有办法吗?必须能够在Hibernate中执行包含GROUP BY子句的查询,而不在结果中包含ID。

如果有更好的方法,我愿意接受其他不使用命名查询的建议。

共有3个答案

南门洋
2023-03-14

事实上,我找到了一个更好的解决方案(针对我的情况),但这并不适用于所有情况。

将instrument和quantity设置为复合键意味着可以完全去掉ID字段。我将其添加到映射XML中

    <composite-id>
        <key-property name="portfolio" />
        <key-property name="instrument" />
    </composite-id>

我会留下公认的答案,因为它在当时有帮助(投资组合栏在我最初的问题中没有出现)。

袁桐
2023-03-14

我认为问题在于你的数据库,而不是hibernate。我怀疑它不支持对别名列使用“分组依据”。

你有没有试过:

FROM MY_TABLE WHERE SRC_PORTFOLIO= :portfolio GROUP BY {position.instrument} 
秦博达
2023-03-14

您可以简单地将“随机”ID添加到查询结果集中并使Hibernate满意,即。

    SELECT
    MAX(YOUR_ID_COLUMN) AS {position.id}, 
    SUM(LEG_ONE_NOMINAL) AS {position.quantity}, 
    ID_INSTRUMENT AS {position.instrument} 
    FROM MY_TABLE WHERE SRC_PORTFOLIO= :portfolio GROUP BY ID_INSTRUMENT
 类似资料:
  • 问题内容: 我对Hibernate Native Query有问题。我有一个选择,它选择数组切片(PostgreSQL数据库)。 问题在于hibernate状态识别以下部分:来自“ SELECT my_array [1:300] …”的“:300”作为命名参数,并且我得到以下异常:尚未设置所有命名参数。 我试图用’:’,’::’逃脱冒号(:),但没有成功。 Hibernate版本是3.2 问题答案

  • 问题内容: 我想要做的是计算子查询返回的行数,本质上如下: 这是我的错误信息: 为什么这不起作用?如果select仅返回一堆具有过滤条件的行,为什么我不能计算行数或返回的行数? 我正在计算拥有的不同员工的数量。按分组。 这是有关我的数据库的一些结构信息,作为查询的一部分。 谢谢! 问题答案: 试试这个 或这个

  • 问题内容: 使用Hibernate时,有什么方法可以在命名查询中指定可选参数(例如,从表单提供搜索参数而并非所有参数都是必需的)?我正在使用本机SQL查询,但该问题可能也适用于命名HQL查询。 我很确定对此的答案是“否”,但是我还没有在文档中找到确切的答案。 问题答案: AFAIK,没有这样的事情,因此您必须为此编写一个动态查询。也许看一下以前的答案,该答案显示了如何在HQL中执行此操作(您可以将

  • 我使用复合和术语聚合来获得基于给定字段的分组结果。我还使用基数聚合来获取聚合桶的总计数。 下面是我发送的请求查询,以获得相应的响应: 请求: 答复: 我使用Kibana检查查询,它对我来说很好。 但是,我不确定如何在我的NEST对象语法中使用这个基数聚合器。 这是我的代码: 我将非常感谢任何帮助。

  • 我正在用PySpark DataFrames分析一些数据。假设我有一个正在聚合的数据帧< code>df: 这将给我: 聚合工作得很好,但我不喜欢新的列名。有没有办法将此列重命名为人类可以从方法中读取的内容?也许更类似于中的操作:

  • 在普通函数调用中,调用中的参数按被调用函数的参数顺序逐个匹配。 命名参数允许您以不同的顺序将参数传递给函数。 语法只是每个参数前面都有一个参数名和一个等号。 尝试以下程序,这是一个使用命名参数显示函数的简单示例。 例子 (Example) object Demo { def main(args: Array[String]) { printInt(b = 5, a = 7);