2012-07-03 1 views
4

странно Я не могу найти что-то простое, у меня есть 2 объекта, один внутри другого, и мой вопрос в том, как я могу получить доступ к свойству из суб-сущности?Критерии, как получить доступ к свойству подкласса

объект 1

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

объект 2

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

что я хочу, чтобы получить доступ ПАНСИОНОВ и диапазон с поиском критериев, так что я сделал это:

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(); 

}

имя a d фамилия может быть доступна, но семья и диапазон не могут. 'не удалось устранить свойство' Что мне делать?

благодаря = D

ответ

5

Вы должны создать псевдоним для свойства подкласса, чтобы иметь возможность доступа к нему.

Взгляните на раздел 15.4 следующего ручной 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», семейство)); } – WeMakeSoftware

+0

спасибо, что это помогло, в конце концов, это сработало: c.createAlias ​​(«a.B», «subB»). Add (Restrictions.eq («subB.family», family)); – Eildosa

2

В вашем случае я не уверен, что вам нужно псевдонимами. просить на вложенную лица, необходимо создать критерии по суб-объекта, а затем добавить параметры на нем:

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 будет возвращен, поэтому вы можете захотеть создать подкритерий, только если family и range не пустые.

+0

Это в основном просто еще один способ создать одно и то же. С createAlias ​​() код чище IMHO – WeMakeSoftware

+1

Я обычно использую псевдонимы только тогда, когда существует потребность в критериях между двумя разными субинструкциями. В основном, потому что я считаю, что синтаксис подкритериев проще. – Sebastien

+0

Я полностью согласен с sebastien +1 для этого – Secondo