次の Event クラスを保持したい:
public class Event {
private Long id;
private LocalizableString name = new LocalizableString();
/* setters and getters */
}
休止状態でデータベースに。クラス「LocalizableString」は次のとおりです。
public class LocalizableString {
private Map<Locale, String> values = new HashMap<Locale, String>();
/* setters and getters */
}
だからここに私が作成したマッピングがあります:
<hibernate-mapping>
<class name="path.to.my.Event" table="MyEventTable">
<id name="id" column="Un_ID" type="java.lang.Long">
<generator class="path.to.my.IDGenerator" />
</id>
<component name="name">
<map name="values" table="NamesOfMyEvents">
<key column="event_id"/>
<map-key column="locale" type="java.util.Locale"/>
<element column="value" type="string"/>
</map>
</component>
</class>
</hibernate-mapping>
最初はすべて問題ないように見えます。name 属性のマップに名前の翻訳を大量に入力し、それらの名前を保持し、DB からイベントを取得することができます。SQL を使用して DB を直接見ると、すべて問題ないように見えます。
しかし、プロジェクションを使用して、次の HQL-Query を実行したい日が来ました。
select e.name from Event e where id = :id
今、私は次の例外を受け取ります:
java.lang.ArrayIndexOutOfBoundsException: 0
at org.hibernate.hql.ast.util.ColumnHelper.generateScalarColumns(ColumnHelper.java:62)
at org.hibernate.hql.ast.tree.DotNode.setScalarColumnText(DotNode.java:667)
at org.hibernate.hql.ast.tree.SelectClause.renderScalarSelects(SelectClause.java:375)
at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:250)
at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:831)
at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:619)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:672)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1651)
まあ、それはひどいです。私にできることはありますか?Hibernate 3.3.2 を使用しています。バージョンがかなり古いことは承知していますが、アップグレードするのは簡単ではありません。したがって、これがバグである場合は、回避策を提供していただければ幸いです。どのバージョンが問題を修正しているかを知ることも有用な情報です。