7

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

6 回答 6

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

这将返回一个List<Parent>.

您可以在hql 参考中查看所有这些

于 2012-06-13T22:54:00.817 回答
1

尝试如下操作:

from Parent as parent
    left join parent.childList as children
        with children.favoriteColor = 'blue'
where parent.name = 'John'
于 2012-06-13T23:18:59.230 回答
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
    }
于 2017-08-10T08:04:50.943 回答
1

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

left join fetch ”在 List<Parent> 中给出结果

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

于 2016-08-17T21:03:44.020 回答
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。

于 2012-06-15T17:14:55.353 回答
0

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

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

运算符 IN 迭代列表,从而避免使用 JOIN。

于 2012-06-13T23:26:49.147 回答