查询Composite Key内部实体属性

时间:2011-07-31 17:39:21

标签: java hibernate

我有一个名为ProductTemplate的实体,其中包含以下hibernate映射

<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映射:

<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>

现在,如果我尝试根据productId检索所有productTemplates,我可以使用以下hibernate标准来完成:

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 个答案:

答案 0 :(得分:1)

我通过简单的HQL查询来解决这个问题,因为我没有找到任何使用hibernate API的方法

这是我使用的HQL查询:

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

但我仍然有兴趣知道是否有任何Hibernate API组合可以做到这一点。

答案 1 :(得分:0)

在条件中指定属性名称时,除了ID之外,我无法超过2个级别。尝试使用带别名的显式连接:

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