1

これは、この投稿のフォローアップ投稿です。私はh2データベースに裏打ちされた会計システムを書いています。アカウントのツリーはACCOUNTSテーブルに格納され、PARENT_ID列にはツリー内のリンクが格納されます。

ツリー内の特定のノードへのパスを取得するために、次のストアドプロシージャがあります。

public static Long[] getAncestorPKs(Long id)

その仕事は、指定されたノードとツリーのルートの間のPARENT_ID値である整数の配列を生成することです。これが次のように定義されていると想像してみましょう(これを試したところ、同じエラーが発生したため):

public static Long[] getAncestorPKs(Long id)
{
  return new Long[]{new Long(1), new Long(2), new Long(3)};
}

データベースに正しく登録されており、SQLクエリ内から呼び出すことができます。私の問題は、h2が戻り値を処理できないように見えることです。次のように使用すると、次のようになります。

SELECT ID FROM ACCOUNTS WHERE ID IN (ANCESTOR_PKS(5))

次に、次のエラーが発生します。

Data conversion error converting "(1, 2, 3)"; SQL statement:
SELECT ID FROM ACCOUNTS WHERE ID IN (ANCESTOR_PKS(5)) [22018-167]

代わりに、以下をデータベースに送信する場合:

SELECT ID FROM ACCOUNTS WHERE ID IN (1, 2, 3)

3つの整数(まさに私が期待するもの)を含む3行の結果セットが返されます。

ここで何が問題なのか本当にわかりません!BIGINTSを含む列との比較に使用されるLongsの配列を返します。h2がこの配列の変換を拒否するのはなぜですか?戻り値をObject[]にしようとしました。これは、h2のドキュメントでは、これが戻り側と呼び出し側のどちらで必要かが完全には明確ではないためですが、まったく違いはありません。ここのレンガの壁に頭をぶつけているところです。これはロケット科学ではありません!確かに誰かが以前に同様のコードを書いたことがありますか?

私が怒る前に、事前に感謝します!

4

1 に答える 1

0

メソッドがオブジェクトの配列を返す場合、データベースの場合、これはデータ型ARRAYの1つの値です。そして、3行のテーブルではありません。ただし、もちろん、テーブルでデータ型ARRAYを使用するのではなく、INTまたはBIGINTを使用します。したがって、クエリは正しくありません。

メソッドがResultSetを返すか、配列値をテーブルに変換する必要があります。TABLE(..)これを行うには、次のように関数を使用できます。

select x from table(x bigint = getAncestorPKs(1));

だからあなたができることは:

drop table accounts;
create table accounts(id int);
insert into accounts values(1), (2), (10), (20);
drop alias getAncestorPKs;
create alias getAncestorPKs as 'Long[] getAncestorPKs(Long id) {
  return new Long[]{new Long(1), new Long(2), new Long(3)};
}';
select * from accounts where id in
(select x from table(x bigint = getAncestorPKs(1)));
于 2012-07-26T17:09:03.003 に答える