2012-06-13 12 views
6

Mam obiekt z kilku relacji @onetomany, i muszę zapytać o właściwości w rodzica, a także właściwości dzieci. Nie mogę tego zrobić.Hibernate HQL Query, aby uzyskać rodzic + dzieci w oparciu o childID

Na przykład potrzebuję zapytania, które pozwoli mi zobaczyć obiekty nadrzędne, w których rodzic ma na imię "John" i ulubiony kolor dziecka jest niebieski. Mam nadzieję, że ma to sens. Powodem komplikacji wydaje się być to, że dzieci są na liście, a nie w związku @onetoone.

PARENT: 
@Entity 
@Table(name="Parent") 
public class Parent { 
    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="parent_gen") 
    @SequenceGenerator(name="parent_gen", sequenceName="PARENT_SEQUENCE") 
    private int parentID; 

    @Column(name="name") 
    private String name; 

    @OneToMany(cascade=CascadeType.ALL) 
    @OrderBy("name ASC") 
    @JoinTable(name = "parent_to_child") 
    private List<Child> childList; 
    // and so forth 

Child 
@Entity 
@Table(name="Child") 
public class Child{ 
    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="child_gen") 
    @SequenceGenerator(name="child_gen", sequenceName="CHILD_SEQUENCE") 
    private int childID; 

    @Column(name="favoriteColor") 
    private String favoriteColor; 

    // and so forth 

Odpowiedz

6
select p from Parent p join p.childList c 
    where p.name = 'John' and c.favoriteColor = 'blue' 

ta zwróci List<Parent>.

Możesz zajrzeć wszystko to w hql reference

+0

Wydaje się pobrać wyniki w 2 dwóch odległych obiektów rodzica w [0] i dziecku w [1]. To może zadziałać, ale pomyślałem, że po prostu zwróci "prawdziwe" obiekty? Muszę wymyślić, jak pobrać rodzica i dziecko z ogólnego obiektu, który są zwracane jako ... Idę tam! – Jorge

+0

@ user1454878 Do tego potrzebna jest klauzula select. Będę edytować odpowiedź. – Pablo

+0

To nadal pokazuje każdy obiekt podrzędny na liście, niezależnie od tego, czy ulubiony kolor to niebieski, czerwony czy biały. Jest to normalne? Czy nie powinno się pokazywać tylko obiektów podrzędnych, których favoriceColor jest niebieskie? – Eniss

1

Spróbuj czegoś, co następuje:

from Parent as parent 
    left join parent.childList as children 
     with children.favoriteColor = 'blue' 
where parent.name = 'John' 
0

JPQL udostępnia specjalną składnię, że w tych przypadkach sprawia, że ​​rzeczy łatwiej i pomaga myśleć w zorientowanego Obiekt docelowy:

SELECT p FROM Parent P, IN (P.childList) C 
WHERE P.name='John' and C.favoriteColor='blue'; 

Operator IN wykonuje iteracje na listach, co pozwala uniknąć konieczności stosowania powiązań.

0
Criteria criteria=session.createCriteria(Parent.class); 
criteria.add(Restrictions.eq("name", "John")); 
criteria.createAlias("childList", "child"); 
criteria.add(Restrictions.eq("child.favoriteColor", "Blue").ignoreCase()); 

Możesz także spróbować z API kryteriów.

0

Musisz zrobić - rodzic "lewy dołączyć pobrać" dziecko z twoim stanem.

"lewo sprzężenia pobierania" daje wynik w wykazie < Parent>

bez Pobiera będzie listy, na której obiekt [0] = macierzysty i obiekt [1] = dziecko.

0
public class Clients implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
     @OneToMany(cascade = { CascadeType.ALL},orphanRemoval=true) 
     @JoinColumn(name="client_id") 
     List<SmsNumbers> smsNumbers; 
     } 

@Table(name="smsnumbers") 
    public class SmsNumbers implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    int id; 
String number; //getter and setter 
} 

Na podstawie klasy dzieci i pobrać macierzystego do jednokierunkowego związku stosując następujące criteria-

Session session = HibernateUtil.openSession(); 
    try{ 
     Criteria criteria=session.createCriteria(Clients.class); 
    criteria.createAlias("smsNumbers", "child"); 
    criteria.add(Restrictions.eq("child.number", phone).ignoreCase()); 
    Clients cli=(Clients) criteria.list().get(0); 
    System.out.println(cli.getId()); 
    }catch (Exception e) { 
     // TODO: handle exception 
    }