Hibernate HQL Query根据childID获取父+子

时间:2012-06-13 22:17:43

标签: java hibernate hql parent

我有一个带有几个@onetomany关系的对象,我需要查询父项中的属性以及子项的属性。我似乎无法完成它。

例如,我需要一个查询,让我看到父对象,其中父级的名称是“John”孩子最喜欢的颜色是蓝色。希望有道理。复杂化的原因似乎是儿童在列表中,而不是在@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

6 个答案:

答案 0 :(得分:6)

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

这将返回List<Parent>

您可以在hql reference

中查看所有这些内容

答案 1 :(得分:1)

尝试以下内容:

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

答案 2 :(得分:1)

  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
}

在子类的基础上,我使用以下标准以单向关系获取父级 -

   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
    }

答案 3 :(得分:0)

JPQL提供了一种特殊的语法,在这些情况下,可以使事情变得更容易,并帮助您以面向对象的方式思考:

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

运算符IN迭代列表,因此无需使用JOIN。

答案 4 :(得分: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());

您也可以尝试使用条件API。

答案 5 :(得分:0)

你需要做的是 - 父母“左连接获取”孩子你的病情。

左连接提取”会在List&lt;中显示结果父&GT;

如果没有Fetch,它将是List,其中object [0] = parent和object [1] = child。