Запрос составного ключа к внутренним свойствам сущности - PullRequest
3 голосов
/ 31 июля 2011

У меня есть одна сущность с именем ProductTemplate со следующим отображением гибернации

<hibernate-mapping default-cascade="none">
    <class name="com.stackoverflow.ProductTemplateImpl" table="PRODUCT_TEMPLATE" dynamic-insert="false" dynamic-update="false">
        <composite-id name="productTemplatePk" class="com.stackoverflow.product.ProductTemplatePK">
            <key-property name="templateType" type="java.lang.String">
                <column name="TEMPLATE_ID" sql-type="VARCHAR2(255)" not-null="true"/>
            </key-property>
            <key-many-to-one name="product" class="com.stackoverflow.ProductImpl" >
                <column name="PROD_ID"/>
            </key-many-to-one>
        </composite-id>
    </class>
</hibernate-mapping>

где ProductTemplatePK - это обычный класс первичного ключа Java.

и другой объект под названием Product со следующим отображением гибернации:

<hibernate-mapping default-cascade="none">
    <class name="com.stackoverflow.ProductImpl" table="PRODUCT" dynamic-insert="false" dynamic-update="false">
        <id name="id" type="java.lang.String" unsaved-value="null">
            <column name="PROD_ID" sql-type="VARCHAR2(255)"/>
            <generator class="assigned">
            </generator>
        </id>
        <property name="state" type="java.lang.String">
                     <column name="PROD_STATE" not-null="true" unique="false"/>
        </property>
        <property name="nameEn" type="java.lang.String">
                     <column name="PROD_NAME_EN" not-null="true" unique="false"/>
        </property>
    </class>
</hibernate-mapping>

Теперь, если я попытался получить все шаблоны productTemplates на основе productId, я могу сделать это, используя следующие критерии гибернации:

Criteria productTemplateCriteria = this.getSession().createCriteria(ProductTemplate.class);
productTemplateCriteria.add(Restrictions.in("productTemplatePk.product.id", "1"));

но я не знаю, как получить эти шаблоны на основе product.nameEn в виде следующего кода:

Criteria productTemplateCriteria = this.getSession().createCriteria(ProductTemplate.class);
productTemplateCriteria.add(Restrictions.in("productTemplatePk.product.nameEn", "Ali"));

генерирует следующую ошибку: Вызвано: org.hibernate.QueryException: не удалось разрешить свойство: productTemplatePk.product.nameEn of: com.stackoverflow.ProductTemplateImpl.

так, как я могу запросить свойство сущности, которое отображается как часть составного первичного ключа?

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Мне удалось решить это простым HQL-запросом, так как я не нашел способа сделать это с помощью hibernate API

это HQL-запрос, который я использовал:

 from com.stackoverflow.ProductTemplateImpl productTemplate
where productTemplate.productTemplatePk.product.state not in (:productStates) 

Но мне все еще интересно знать, есть ли какая-либо комбинация Hibernate API, которая может это сделать.

0 голосов
/ 01 августа 2011

Мне не удалось пройти глубже, чем на 2 уровня, кроме идентификаторов при указании имен свойств в критериях.Попробуйте использовать явное соединение с псевдонимом:

Criteria crit = this.getSession().createCriteria(ProductTemplate.class);
crit.addAlias("productTemplatePk.product","p")
    .add(Restrictions.in("p.nameEn", "Ali"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...