【问题标题】:Hibernate HQL Query to get parent + children based on childIDHibernate HQL查询根据childID获取父+子
【发布时间】:2012-06-16 22:57:25
【问题描述】:

我有一个具有多个@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

【问题讨论】:

    标签: java hibernate hql parent


    【解决方案1】:
    select p from Parent p join p.childList c
        where p.name = 'John' and c.favoriteColor = 'blue'
    

    这将返回一个List&lt;Parent&gt;

    你可以在hql reference查看这一切

    【讨论】:

    • 这似乎将结果获取为 2 个不同的对象,[0] 中的父对象和 [1] 中的子对象。这可能有效,但我认为它只会返回“真实”对象?我需要弄清楚如何从返回的通用对象中获取父子对象...我到了!
    • @user1454878 为此需要一个 select 子句。我会编辑答案。
    • 无论 favoriteColor 是蓝色、红色还是白色,这仍然会显示列表中的每个子对象。正常吗?难道不应该只显示喜爱颜色为蓝色的子对象吗?
    • @此选择返回父母,而不是孩子。它将返回任何具有 favoriteColor = 'blue' 的孩子的父母,即使它有更多的喜爱颜色与蓝色不同的孩子。
    • @Pablo 我们可以使用 Criteria API 以某种方式做到这一点吗?
    【解决方案2】:

    尝试以下方法:

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

    【讨论】:

      【解决方案3】:

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

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

      运算符 IN 遍历列表,从而避免使用 JOIN。

      【讨论】:

        【解决方案4】:
        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】:

          你需要做 --- 父母“左加入获取”孩子与你的条件。

          "left join fetch" 在 List

          中给出结果

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

          【讨论】:

            【解决方案6】:
              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
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-04-25
              • 2011-09-25
              • 2011-05-18
              • 2013-09-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多