2011-07-21 9 views
6

hibernateでネイティブクエリを使用してenumプロパティを含むBeanに別名を付けるのに問題があります。私は、query.list()が呼び出されたときにInvocationTargetExceptionを取得しています。私の例は以下の通りです:Hibernate - enumプロパティを持つBeanへのネイティブクエリとエイリアスを使用しますか?

@Entity(name = "table1") 
public class Class1 { 
    @Column(name = "col1") 
    @NotNull 
    private Integer prop1; 

    @Column(name = "col2") 
    @NotNull 
    private String prop2; 

    @Column(name = "col3", length = 6) 
    @Enumerated(value = EnumType.STRING) 
    private MyEnumType prop3; 

    // ... Getters/Setters... 
} 

public List getClass1List(){ 
    String sql = "select col1 as prop1, col2 as prop2, col3 as prop3 from table1"; 

    Session session = getSession(Boolean.FALSE); 
    SQLQuery query = session.createSQLQuery(sql); 
    query.addScalar("col1", Hibernate.INTEGER); 
    query.addScalar("col2", Hibernate.STRING); 
    query.addScalar("col3", Hibernate.STRING); 

    query.setResultTransformer(Transformers.aliasToBean(Class1.class)); 

    return query.list(); 
} 

query.addScalar(「COL3」、Hibernate.STRING)通話中に、私はCOL3に使用するどのような種類(列挙型)を知りません。 Hibernate.Stringが機能していません!私も完全に(query.addScalar( "col3"))をオフにして型を残そうとしましたが、私は同じInvocationTargetExceptionを取得します。誰もがこれで私を助けることができますか?私のモデルは変更できません。ネイティブのSQLクエリが残っています。任意のアイデアが評価されます。

+0

SQL文で "col1 as prop1"のエイリアスを行っている場合、Hibernateでマップできるようになりますか? –

答えて

2

まず、あなたは

private EnumType prop3; 

しかしActualEnumは(リンゴとオレンジを区別するために、例えば、Fruits)独自の列挙型である

private ActualEnum prop3; 

を使用しないでください。

第2に、ネイティブSQLを使用すると、ハイバネート・マッピングは無関係です。

ここで私が提案できるオプションがいくつかあります。あなたはスカラーの束の代わりにaddEntity()を使用しようとすることができます。 Hibernateがenumプロパティを正しく認識し、正しくマップする可能性があります。

その他のオプションは、データベースから文字列を取り込み、それを列挙型に変換して実際のプロパティを設定する非公開設定を持つことです。

最後に、トランスフォーマをカスタマイズすることができます。しかし、おそらく最も複雑な選択肢です。

+0

私は実際に自分のenumタイプを使用しています。それは、私がEnumTypeを使用したのは純粋な偶然と不注意でした。質問は編集されて、いいキャッチ。投稿する前に2番目のオプションを指定したので、最初のオプションを試してみます。私の質問の変更を反映するためにあなたの答えを自由に編集してください。 – javagruffian

3
// In public List getClass1List() method: 
// 1. DEFINE: 
Properties params = new Properties(); 
params.put("enumClass", "enumerators.MyEnumType"); 
params.put("type", "12"); 

// 2. REPLACE: 
// query.addScalar("col3", Hibernate.STRING); 
// X 

query.addScalar("col3", Hibernate.custom(org.hibernate.type.EnumType.class, params)); 
関連する問題