0

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;
}
}

私がやろうとしているのは、名前付きクエリを取得して、別の列でグループ化された1つの列の合計を返すことです。ただし、クエリ結果にID列が含まれていないため、Hibernateがエラーをスローしていると思われます。

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

これを回避する方法はありますか?Hibernate内で、結果にIDを含めずにGROUPBY句を含むクエリを実行できる必要があります。

より良い方法があれば、名前付きクエリを使用しない他の提案を受け入れます。

4

3 に答える 3

1

クエリ結果セットに「ランダム」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
于 2013-01-02T18:23:03.973 に答える
0

私は実際にこれに対するより良い解決策を見つけました(私の場合)すべての場合にうまくいくわけではありません。

楽器と数量を複合キーとして設定すると、IDフィールドを完全に取り除くことができます。これをマッピングXMLに追加しました

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

受け入れられた回答は、その時点で役に立ったのでそのままにしておきます(そして、ポートフォリオの列は私の元の質問にはありませんでした)。

于 2013-01-11T10:02:00.310 に答える
0

問題は、休止状態ではなく、データベースにあると思います。エイリアス列での「groupby」の使用はサポートされていないようです。

やってみました:

FROM MY_TABLE WHERE SRC_PORTFOLIO= :portfolio GROUP BY {position.instrument} 
于 2013-01-02T18:18:35.670 に答える