2012-06-13 11 views
6

Tôi có một đối tượng có nhiều mối quan hệ @onetomany và tôi cần truy vấn các thuộc tính trong cha mẹ cũng như các thuộc tính của trẻ. Tôi dường như không thể hoàn thành nó.Hibernate HQL Truy vấn để nhận cha mẹ + con cái dựa trên childID

Ví dụ, tôi cần một truy vấn cho phép tôi xem các đối tượng gốc nơi tên của cha mẹ là "John" màu yêu thích của trẻ là màu xanh lam. Hy vọng rằng có ý nghĩa. Lý do cho các biến chứng dường như là trẻ em trong một danh sách, không phải trong một mối quan hệ @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 

Trả lời

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

này sẽ trả về một List<Parent>.

Bạn có thể tìm kiếm tất cả điều này trong hql reference

+0

này dường như để lấy kết quả như 2 đối tượng riêng biệt, cha mẹ trong [0] và trẻ em trong [1]. Điều này có thể làm việc, nhưng tôi nghĩ rằng nó sẽ chỉ trả lại các đối tượng "thực sự"? Tôi cần phải tìm ra cách để lấy cha mẹ và con ra khỏi đối tượng chung chung họ được trả về như ... Tôi nhận được ở đó! – Jorge

+0

@ user1454878 Một mệnh đề chọn là cần thiết cho điều đó. Tôi sẽ chỉnh sửa câu trả lời. – Pablo

+0

Điều này vẫn hiển thị mọi đối tượng con trong danh sách cho dù favoritesColor có màu xanh dương, đỏ hay trắng. Nó có bình thường không? Nó không phải là chỉ để hiển thị các đối tượng con mà favoriceColor là màu xanh? – Eniss

1

Hãy thử một cái gì đó như sau:

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

JPQL cung cấp một cú pháp đặc biệt, trong những trường hợp này, làm cho mọi thứ dễ dàng hơn và giúp bạn suy nghĩ trong một Oriented Cách đối tượng:

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

Toán tử IN lặp lại danh sách, do đó tránh nhu cầu sử dụng 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()); 

Bạn cũng có thể thử với API tiêu chí.

0

bạn cần phải làm --- cha mẹ "còn lại tham gia tìm nạp" con với tình trạng của bạn.

"LEFT JOIN lấy" cho kết quả trong Danh sách < Chánh>

Without Fetch nó sẽ được Danh sách nơi đối tượng [0] = phụ huynh và đối tượng [1] = đứa trẻ.

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 
} 

Trên cơ sở của lớp con tôi lấy mẹ trong mối quan hệ một chiều bằng cách sử dụng sau đây 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 
    }