2012-06-13 12 views
6

Tengo un objeto con varias relaciones @onetomany, y necesito consultar las propiedades en el padre, así como las propiedades de los hijos. Parece que no puedo hacerlo.Hibernate HQL Consulta para obtener parent + children basado en childID

Por ejemplo, necesito una consulta que me permita ver los objetos principales donde el nombre del padre es "Juan" y el color favorito del niño es azul. Espero que tenga sentido. El motivo de la complicación parece ser que los niños están en una lista, no en una relación @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 

Respuesta

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

Esto devolverá un List<Parent>.

Usted puede mirar todo esto en el hql reference

+0

Esto parece a buscar los resultados como 2 objetos distintos, de los padres en [0] y el niño en [1] Esto podría funcionar, pero pensé que solo devolvería los objetos "reales". Necesito averiguar cómo sacar al padre y al hijo del objeto genérico que se devuelven, ya que ... ¡ya llegué! – Jorge

+0

@ user1454878 Se necesita una cláusula de selección para eso. Editaré la respuesta. – Pablo

+0

Esto todavía muestra todos los objetos secundarios en la lista sin importar si favoriteColor es azul, rojo o blanco. ¿Es normal? ¿No se suponía que solo mostraba objetos secundarios cuyo favoritoColor es azul? – Eniss

1

probar algo de la siguiente manera:

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

JPQL proporciona una sintaxis especial que, en estos casos, facilita las cosas y le ayuda a pensar en una Orientada forma del objeto:

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

el operador IN itera sobre listas, evitando así la necesidad de utilizar combinaciones.

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

Usted puede tratar con criterios API también.

0

tiene que hacer --- padre hijo "left join fetch" con su condición.

"izquierda join fetch" da resultado en la lista < Padres>

Sin Fetch será objeto de lista donde [0] = padre y el objeto [1] = niño.

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 
} 

Sobre la base de la clase hija voy a buscar a los padres en relación unidireccional utilizando la siguiente criterio-

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 
    } 
Cuestiones relacionadas