3

現在のプロジェクトでは、long-matching-prefixタイプのクエリが必要ですが、奇妙なことに、列はbigintとして十分に定義されていました。以下のスニペットで解決策を考え出しました。ここでは、パラメーター?2?3に一致する列dcで最長の数値を見つけたいと考えています。また、?1の日付は2つの日付列の間にあります。

関連する依存関係は次のとおりです。

  • Postresql 8.4
  • Hibernate 3.6.10
  • Hibernate JPA 1.0.1
  • 春3.2.1

ソースは次のとおりです。

...
String query_string = "SELECT * FROM numberlist WHERE " +
            "?1 BETWEEN init_date AND COALESCE(end_date,'2999-12-31') " +
            "AND dc IN " +
            "(select ?2/(10^i)::int8 from generate_series(0,floor(log(?3))::int) i) " +
            "ORDER BY dc DESC LIMIT 1";

Query query = emf.createEntityManager().createNativeQuery(query_string, MyNumber.class);
    query.setParameter(1, valid_date);
    query.setParameter(2, num);
    query.setParameter(3, num);

MyNumber result = (MyNumber)query.getSingleResult();
...

次の例外が発生します。

Caused by: org.hibernate.QueryException: Not all named parameters have been set: [:int8, :int]

問題は、 :int:int8をパラメーターとして使用するHibernateであると考えていますが、解決策を見つけることができません。

ご協力ありがとうございました。

4

4 に答える 4

2

(select ?2/(10^i)::int8として書き直すことができますCAST((select ?2/(10^i) AS INT8)。一般に、任意の型キャストはと
の両方として記述できます。 この形式は同一であり、同一の結果が得られます。<data>::<type>CAST(<data> AS <type>)

于 2015-09-23T13:21:16.253 に答える
1

使用しようとしましたか:

query.setParameter(":int8", valid_date);

それ以外の:

query.setParameter(1, valid_date);
于 2013-02-21T11:09:41.660 に答える
0

上記の私のコメントに書かれているように、私は最終的に以下を使用しました:

public class LegacyDao extends JdbcDaoSupport

このようにして、Hibernateが使用していたデータソースを再利用することができました。

于 2014-10-30T14:08:14.263 に答える
0

\前にダブルを入れてみてください:

...
String query_string = "SELECT * FROM numberlist WHERE " +
            "?1 BETWEEN init_date AND COALESCE(end_date,'2999-12-31') " +
            "AND dc IN " +
            "(select ?2/(10^i)\\:\\:int8 from generate_series(0,floor(log(?3))\\:\\:int) i) " +
            "ORDER BY dc DESC LIMIT 1";

Query query = emf.createEntityManager().createNativeQuery(query_string, MyNumber.class);
    query.setParameter(1, valid_date);
    query.setParameter(2, num);
    query.setParameter(3, num);

MyNumber result = (MyNumber)query.getSingleResult();
...
于 2021-06-24T01:28:28.840 に答える