Гибернационная пагинация ORA-00918: колонка неоднозначно определена

Когда hibernate пытается разбить на страницы сущность, сгенерированную с использованием следующего hbm.xml, он выбрасывает столбец с неоднозначным определением.

<class lazy="false" dynamic-update="true" optimistic-lock="all" table="A" name="org.package.Entity">
  <cache usage="read-write"/>
  <id unsaved-value="null" type="java.lang.Long" name="aId">
    <column name="ID_A" not-null="true" sql-type="java.lang.Long"/>
    <generator class="org.package.Entity"/>
  </id>
  <property type="java.lang.Long" name="aGroupId" not-null="true">
    <column name="ID_GROUP" not-null="true" sql-type="java.lang.Long"/>
  </property>
  <property type="java.lang.String" name="statusCode" not-null="true">
    <column name="CD_STATUS" not-null="true" sql-type="char(30)" length="30"/>
  </property>
  <property type="java.lang.Long" name="templateId" not-null="false">
    <column name="ID_TEMPLATE" not-null="false" sql-type="java.lang.Long"/>
  </property>

  <many-to-one name="aGroup" cascade="none" column="Id_Group" 
      class="org.package.Entity"
      insert="false" update="false"/>
  <many-to-one name="template" cascade="none" column="ID_TEMPLATE" 
      class="org.package.Entity"
      insert="false" update="false"/>
</class>

Что не так с этим определением сущности?

Изменить: превращение его в формат QandA.

1 ответ

Решение

ID_TEMPLATE сгущается в один столбец в запросе, а ID_GROUP - нет.

Hibernate использует прямое сравнение строк, чтобы увидеть, зависят ли два свойства от одного столбца. Это чувствительно к регистру, поэтому ID_GROUP был выбран второй раз как Id_Group.

Изменяя случаи, чтобы соответствовать, это работало.

<class lazy="false" dynamic-update="true" optimistic-lock="all" table="A" name="org.package.Entity">
  <cache usage="read-write"/>
  <id unsaved-value="null" type="java.lang.Long" name="aId">
    <column name="ID_A" not-null="true" sql-type="java.lang.Long"/>
    <generator class="org.package.Entity"/>
  </id>
  <property type="java.lang.Long" name="aGroupId" not-null="true">
    <column name="ID_GROUP" not-null="true" sql-type="java.lang.Long"/>
  </property>
  <property type="java.lang.String" name="statusCode" not-null="true">
    <column name="CD_STATUS" not-null="true" sql-type="char(30)" length="30"/>
  </property>
  <property type="java.lang.Long" name="templateId" not-null="false">
    <column name="ID_TEMPLATE" not-null="false" sql-type="java.lang.Long"/>
  </property>

  <many-to-one name="aGroup" cascade="none" column="ID_GROUP" 
      class="org.package.Entity"
      insert="false" update="false"/>
  <many-to-one name="template" cascade="none" column="ID_TEMPLATE" 
      class="org.package.Entity"
      insert="false" update="false"/>
</class>

Поддерживать старый код - это весело. Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам