17

X と呼ばれる Hibernate マネージド Java エンティティと、これらの行に沿って Hibernate SQL クエリから呼び出すネイティブ SQL 関数 (myfunc) があります。

SQLQuery q = hibernateSession.createSQLQuery(
                     "SELECT *, myfunc(:param) as result from X_table_name"
             );

result私がやりたいことは、このクエリから返されたすべてのものを Y というクラス (必ずしも Hibernate によって管理されているとは限りません) にマップすることですmyfunc。 「結果」フィールド。

私が試したこと:

  1. 私は使用してみましq.addEntity(Y.class)たが、これは失敗します: org.hibernate.MappingException: Unknown entity com.mycompany.Y
  2. q.setResultTransformer(Transformers.aliasToBean(Y.class));しかし、これは失敗します: org.hibernate.PropertyNotFoundException: Could not find setter for some_property. X にはsomeProperty適切なゲッターとセッターで呼び出されるフィールドがありますが、この場合、Hibernate が列名 (some_property) を正しいフィールド名にマップしているようには見えません。
  3. q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);Map を返しますが、値は常に X の対応するフィールドで期待される型であるとは限りません。たとえば、X の enum 型および Date 型のフィールドは、SQL クエリ (文字列) によって返される Map から直接マップすることはできません。

この状況に対処する適切な方法は何ですか?

4

3 に答える 3

16

SQL クエリに関するドキュメントの章を参照してください。

addScalar()メソッドを使用して、Hibernat が特定の列に使用するタイプを指定できます。

また、エイリアスを使用して結果を Bean プロパティにマップできます。

select t.some_property as someProperty, ..., myfunc(:param) as result from X_table_name t

または、(いくつかのコード行が必要ですが、それが私の好みの解決策です)、単純に自分でマッピングを行うことができます:

List<Object[]> rows = query.list();
for (Object[] row : rows) {
    Foo foo = new Foo((Long) row[0], (String) row[1], ...);
}

これにより反射が回避され、すべてを制御できます。

于 2012-08-07T22:03:23.233 に答える
7

簡単。Map<String, Object>行を次のようにキャストします。

final org.hibernate.Query q = session.createSQLQuery(sql);
q.setParameter("geo", geo);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
final List<Map<String, Object>> src = q.list();
final List<VideoEntry> results = new ArrayList<VideoEntry>(src.size());
for (final Map<String, Object> map:src) {
    final VideoEntry entry = new VideoEntry();
    BeanUtils.populate(entry, map);
    results.add(entry);
}
于 2016-03-21T02:40:29.800 に答える
0

まず最初に、次のように hibernate 構成 xml ファイルでエンティティを宣言する必要があります: ..... class="path to your entity"

または、クエリを作成する前にプログラムで同じことを行うことができます。

于 2015-03-01T08:56:34.240 に答える