2016-09-13 4 views
1

필자는 테이블 (XML 파일에서의 매핑)을 연결하는 추가 fileds와 많은 관계를 맺고있다. 기준 API를 사용하여 제품 이름에 제한을 추가하는 방법은 무엇입니까?Hibernate Criteria API where 절은 many to many 관계이다.

public class Recipe implements Serializable{ 

    private int id_re; 

    private String name; 

    private Set<ProductRecipe> listOfRecipe_Product = new HashSet<>(0); 
} 


public class ProductRecipe implements Serializable{ 

    private ProductRecipeMapping id; 

    private float quantity; 
} 

public class ProductRecipeMapping implements Serializable{ 

    private Product product; 

    private Recipe recipe; 
} 

public class Product implements Serializable{ 

    private int id_p; 

    private String name; 
} 

매핑 :

<class entity-name="recipe" name="Recipe" table="recipe"> 
     <id name="id_re" type="java.lang.Integer"> 
      <column name="id_re" /> 
      <generator class="identity" /> 
     </id> 
     <set name="listOfRecipe_Product" table="recipe_product" lazy="false" fetch="select" cascade="all"> 
      <key> 
       <column name="id_re" not-null="true" /> 
      </key> 

      <one-to-many entity-name="productRecipe" /> 
     </set> 
</class> 

<class entity-name="productRecipe" name="ProductRecipe" table="recipe_product"> 
     <composite-id name="id" class="ProductRecipeMapping" > 
      <key-many-to-one name="recipe" entity-name="recipe" column="id_re" /> 
      <key-many-to-one name="product" entity-name="product" column="id_p" /> 
     </composite-id> 

     <property name="quantity" type="float" column="quantity" /> 

</class>  

<class entity-name="product" name="Product" table="product"> 

     <id name="id_p" type="java.lang.Integer" column="id_p"> 
      <generator class="identity" /> 
     </id> 

     <property name="name" column="name" type="java.lang.String" not-null="true" length="255"/> 

</class> 

예를 들어, "

Criteria cr = session.createCriteria(Recipe.class); 
cr.add(Restrictions.eq("name", "test")); 

하지만 제품의 목록 이름 cr.add 같은 일 (Restrictions.eq ("product.name "모든 조리법을 얻을 모르는 : 나는 이름 테스트와 GET 조리법에 대한 기준을 사용 테스트"));

cr.createCriteria("listOfRecipe_Product") 
    .createCriteria("id") 
    .createCriteria("product") 
    .add(Restrictions.eq("name", "test")); 

내가 오류)

1) Restrictions.eq("listOfRecipe_Product.id.product.name", "test") 하지만 난 오류를 org.hibernate.QueryException: could not resolve property: listOfRecipe_Product.id.product.name of: recipe

2를 얻을 :이 문제는 아무것도하지만, 일을 해결하기 위해이 개념을 사용

을 (그러나 작동하지) org.hibernate.QueryException: Criteria objects cannot be created directly on components. Create a criteria on owning entity and use a dotted property to access component property: listOfRecipe_Product.id

+0

더 구체적 사항 : 특정 이름을 가진 제품을 사용 ALLS 레시피를 반환하는 쿼리를 작성 하시겠습니까? 또한 : 당신은 지금까지 무엇을 시도 했습니까? –

+0

주 설명에 예제를 추가했습니다. –

+0

Restrictions.eq ("listOfRecipe_Product.id.product.name", "test")를 사용했지만 org.hibernate.QueryException 오류가 발생했습니다 : listOfRecipe_Product.id.product 속성을 확인할 수 없습니다. 이름 : 요리법 –

답변

0

매핑 된 자격에 제약 조건을 추가하려면 별칭을 만들어야합니다. ies;

예컨대 :

Criteria cr = session.createCriteria(Recipe.class) 
    .createAlias("listOfRecipe_Product", "listOfRecipe_Product") 
    .createAlias("listOfRecipe_Product.id", "id") 
    .createAlias("id.product", "product") 
    .add(Restrictions.eq("product.name", "test")); 
+0

아마도 매핑에 문제가 있습니까? org.hibernate.QueryException 오류 : 구성 요소에서 조건 오브젝트를 직접 작성할 수 없습니다. 소유하고있는 엔티티에 대한 기준을 만들고 구성 요소 속성에 액세스하기 위해 점으로 구분 된 속성을 사용하십시오. listOfRecipe_Product.id –

+0

예제를 변경하여 엔티티 매핑을 나타내도록합니다. – Marius

+0

org.hibernate.QueryException : 속성을 처리 할 수 ​​없음 : Recipe : recipe 모든 메소드가 제대로 작동하지 않는다면 무엇이 잘못되는지 알지 못합니다. 액세스에 대한 오류가 발생합니다 .... 시간과 도움을 위해서 thx –