2012-07-03 3 views
4

이상한 나는 이것에 대해 간단한 것을 발견 할 수 없다. 나는 2 개의 엔티티를 가지고 있는데, 하나는 다른 엔티티이고 다른 하나는 서브 엔티티의 속성에 어떻게 접근 할 수 있는가?기준, 하위 클래스 속성에 액세스하는 방법

엔티티 1

@Getter 
@Setter 
@Entity 
public class ObjectA{ 
    String name; 
    String surname; 
    ObjectB B; 
} 

기업이

@Setter 
@Getter 
@Entity 
ObjectB{ 
    String family; 
    String range; 
} 

내가 원하는 것은 조건 검색을 familly 및 범위를 액세스 할 수있다, 그래서이 만든 :

public List<ObjectA> search(String name, String surname, String family, String range) { 
    Criteria c = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(ObjectA.class, "a"); 

if (!name.equals("")) { 
    c.add(Restrictions.eq("a.name", name)); 
} 
if (!surname.equals("")) { 
    c.add(Restrictions.eq("a.surname", surname)); 
} 
if (!family.equals("")) { 
    c.add(Restrictions.eq("a.B.family", family)); 
} 
if (!range.equals("")) { 
    c.add(Restrictions.eq("a.B.range", range)); 
} 
return c.list(); 

}

name an d성에 액세스 할 수 있지만 가족과 범위는 액세스 할 수 없습니다. '속성을 확인할 수 없습니다' 어떻게해야합니까?

감사 = D

답변

5

당신은 하위 클래스의 속성에 액세스 할 수 있도록 별칭을 만들어야합니다.

난 당신이 별칭이 필요하다는 것을 확실하지 않다 귀하의 경우에는 다음과 같은 설명서를 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

+0

이 문서는 유용하지 않습니다. c (이미 살펴 봤습니다.) 그들은 실제로 별칭을 만드는 방법을 설명하지만 엔티티 구현을 표시하지 않습니다. 새끼 고양이는 무엇을 대표합니까? 이것이 하위 클래스의 이름입니까? – Eildosa

+1

새끼 고양이는 Cat 클래스에 매핑 된 요소의 모음입니다. 귀하의 경우 그것은 다음과 같습니다 : if (! family.equals ("")) {c.createAlias ​​("B", "B"); c.add (Restrictions.eq ("a.B.family", family)); } – WeMakeSoftware

+0

감사합니다. 결과적으로 다음과 같이 작동합니다. c.createAlias ​​("a.B", "subB"). add (Restrictions.eq ("subB.family", family)); – Eildosa

2

의 섹션 15.4를 살펴 보자. 당신이 그것에 매개 변수를 추가 한 후, 하위 개체에 대한 기준을 만들 필요가, 하위 기관에 요청하려면 다음

public List<ObjectA> search(String name, String surname, String family, String range) { 
    Criteria aCriteria = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(ObjectA.class); 

if (!name.equals("")) { 
    aCriteria.add(Restrictions.eq("name", name)); 
} 
if (!surname.equals("")) { 
    aCriteria.add(Restrictions.eq("surname", surname)); 
} 

Criteria bCriteria = aCriteria.createCriteria("B"); 

if (!family.equals("")) { 
    bCriteria.add(Restrictions.eq("family", family)); 
} 
if (!range.equals("")) { 
    bCriteria.add(Restrictions.eq("range", range)); 
} 
return aCriteria.list(); 

을 조심하십시오 aCriteria.createCriteria("B")가있다 그래야에만 ObjectA 개체를 만들 것 null B가 반환되므로 familyrange이 비어 있지 않은 경우에만 하위 기준을 만들 수 있습니다.

+0

이것은 기본적으로 동일한 것을 만드는 또 다른 방법입니다. createAlias ​​()를 사용하면 코드가 더 깨끗합니다. IMHO – WeMakeSoftware

+1

두 개의 다른 하위 엔티티 사이에 조건이 필요한 경우에만 별칭을 사용하는 경향이 있습니다. 주로 하위 기준 구문이 더 간단하기 때문입니다. – Sebastien

+0

sebastien +1에 강력하게 동의합니다. – Secondo

관련 문제