2

次の 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 を使用しています。バージョンがかなり古いことは承知していますが、アップグレードするのは簡単ではありません。したがって、これがバグである場合は、回避策を提供していただければ幸いです。どのバージョンが問題を修正しているかを知ることも有用な情報です。

4

0 に答える 0