2012-06-13 11 views
6

Ho un oggetto con diverse relazioni @onetomany e ho bisogno di eseguire una query per le proprietà nel padre e anche le proprietà dei figli. Non riesco a farlo.Hibernate HQL Query per ottenere genitore + figli in base all'ID figlio

Per esempio, ho bisogno di una query che mi permette di vedere gli oggetti padre dove dove il nome del genitore è "John" e colore preferito del bambino è blu. Spero che abbia un senso. La ragione della complicazione sembra essere che i bambini sono in una lista, non in una relazione @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 

risposta

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

Ciò restituirà un List<Parent>.

Si può guardare tutto questo nel hql reference

+0

Questo sembra recuperare i risultati come 2 oggetti distinti, genitore [0] e bambino [1]. Questo potrebbe funzionare, ma ho pensato che avrebbe restituito solo gli oggetti "reali"? Ho bisogno di capire come recuperare il genitore e il figlio dall'oggetto generico che vengono restituiti come ... ci sto arrivando! – Jorge

+0

@ user1454878 Per questo è necessaria una clausola select. Modificherò la risposta. – Pablo

+0

Questo mostra ancora ogni oggetto figlio nell'elenco, indipendentemente dal fatto che favoriteColor sia blu, rosso o bianco. È normale? Non si supponeva che mostrasse solo oggetti figlio il cui colore preferito è blu? – Eniss

1

Provare qualcosa come segue:

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

JPQL fornisce uno speciale sintassi che, in questi casi, rende le cose più facili e vi aiuta a pensare in Oriented Object way:

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

L'operatore IN scorre su elenchi, evitando così la necessità di utilizzare JOIN.

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

Puoi provare anche con criteri API.

0

devi fare --- genitore "left join fetch" figlio con le tue condizioni.

"sinistra join fetch" dà risultato nella lista Parent>

< Senza Fetch sarà Lista cui oggetto [0] = genitore e oggetto [1] = bambino.

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 
} 

Sulla base di classe figlia prelevo il genitore in relazione unidirezionale utilizzando la seguente 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 
    } 
Problemi correlati