2017-06-09 3 views
0

データベースビューを使用して複数のクラスを同時に選択しようとしています。どちらの表にも「ID」のような類似の列があります。したがって、ビューはエイリアスで動作しています。 残念ながら、Hibernateは "ID"フィールドを正しくマップしません。ここでHibernate SQLQuery:複数のエンティティとエイリアス化された列名を持つデータベースビュー

簡単な例:

Species     Cat 
| ID | Name   | | ID | Name   | SpeciesId 
+----+--------------+ +----+--------------+--------- 
| 1 | Tuxedo cat | | 1 | Sylvester | 1 
         | 2 | Sylvester Jr | 1 
         | 3 | Sylth Vester | 1 

これらのテーブルには、次のビュー

CREATE VIEW 'CatsBySpecies' AS 
    SELECT 
    SPECIES.ID, 
    SPECIES.NAME, 
    CAT.ID AS CAT_ID, 
    CAT.NAME AS CAT_NAME 
    FROM SPECIES 
    LEFT JOIN CAT ON CAT.SPECIESID = SPECIES.ID; 

クエリの結果につながる可能性は正しいです:

|ID| Name  | CAT_ID | CAT_NAME  | 
+--+----------+--------+--------------+ 
|1 |Tuxedo cat| 1 | Sylvester | 
|1 |Tuxedo cat| 2 | Sylvester Jr | 
|1 |Tuxedo cat| 3 | Sylth Vester | 

これまでのところ、そう良い。

にHibernateクエリ:クラスが正しくマップされていない

String select = "Select * from CatsBySpecies"; 

catQuery = persistentSession.createSQLQuery(select).addEntity(Species.class).addEntity(Cat.class); 
Iterator<?> pairs = catQuery.list().iterator(); 

しかし、結果タプルはこの

Species:    Cat: 
     ID = 1    ID = 1 
     Name = Tuxedo cat Name = Tuxedo cat 

のように見えるので、Hibernateは対応れる列名を認識しているようだし、オブジェクトにそれらを比較します - 属性。

エイリアスをマッピングする方法を休止状態にする方法はありますか? 残念ながら、テーブルにはもっと多くのカラムがあるので、database-resultの各カラムに対してaddScanを避けようとしました。

ヒントやご提案をお待ちしております。

答えて

1

私の選択文字列の適合によって問題を解決しました。 この場合、{0}を使用することが重要です(hereも参照)

さらに、別名の列名をアナウンスする必要がありました。

String select = "Select id as {spec.id}, name as {spec.name}, cat_id as {cat.id}, cat_name as {cat.name} from CatsBySpecies"; 

今、私たちはいつものようにオブジェクトを取得することができます: 新しい選択文字列は次のようになり、私は、これはそこに誰を支援を期待

catQuery = persistentSession.createSQLQuery(select).addEntity("spec", Species.class).addEntity("cat", Cat.class); 

、同じ問題に直面してwho's。

関連する問題