我有一个带有几个@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
答案 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。