Hibernate - 如何获取子集合?
Hibernate - How to fetch a child collection?
我希望我的 HQL 查询 return 一个对象及其子集合。
hbm :
<class name="Object" table="OBJECT">
<id name="id" column="IDOBJECT" type="long" access="field">
<generator class="sequence">
<param name="sequence">OBJECT_SEQ</param>
</generator>
</id>
<many-to-one name="parent" column="IDPARENT" class="Parent" embed-xml="true" />
<set name="children" inverse="true" cascade="all-delete-orphan">
<key column="IDOBJECT" />
<one-to-many class="Child" />
</set>
查询:
SELECT o from Object o JOIN FETCH o.parent JOIN FETCH o.children
最后:
o.parent取
o.children 为空
子项在数据库中并与 returned 对象关联。
我用基于注释的方式测试了你的数据库结构,一切都fine.Test在你身边,检查你遗漏了什么:
Child:
@Entity
@Table(name = "child")
@XmlRootElement
public class Child implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@JoinColumn(name = "idobject", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY)
private entity.Object object;
public Child() {
}
public Child(Integer id) {
this.id = id;
}
//getter and setters
}
Object:
@Entity
@Table(name = "object")
@XmlRootElement
public class Object implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "object", fetch = FetchType.LAZY)
private List<Child> children;
@JoinColumn(name = "idparent", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY)
private Parent parent;
public Object() {
}
public Object(Integer id) {
this.id = id;
}
//getter and setter
}
Parent:
@Entity
@Table(name = "parent")
@XmlRootElement
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private List<entity.Object> objects;
public Parent() {
}
public Parent(Integer id) {
this.id = id;
}
//getter and setters
}
我的查询:
public class ObjectDao {
public static List<Object> getObjects() {
EntityManager em = Persistence.createEntityManagerFactory("test").createEntityManager();
try {
Query query = em.createQuery("SELECT o from Object o JOIN FETCH o.parent JOIN FETCH o.children");
List l = query.getResultList();
return l;
} catch (Exception ex) {
ex.printStackTrace();
return new ArrayList<Object>();
} finally {
em.close();
}
}
}
我用于调试的 servlet:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<entity.Object> objects = ObjectDao.getObjects();
for (entity.Object obj : objects) {
System.out.println("object name:" + obj.getName());
System.out.println("parent name:" + obj.getParent().getName());
List<Child> children = obj.getChildren();
System.out.println("children:");
for(Child c: children){
System.out.println(c.getName());
}
}
}
结果是:
object name:Object 1
parent name:Parent 1
children:
Child Name
我希望我的 HQL 查询 return 一个对象及其子集合。
hbm :
<class name="Object" table="OBJECT">
<id name="id" column="IDOBJECT" type="long" access="field">
<generator class="sequence">
<param name="sequence">OBJECT_SEQ</param>
</generator>
</id>
<many-to-one name="parent" column="IDPARENT" class="Parent" embed-xml="true" />
<set name="children" inverse="true" cascade="all-delete-orphan">
<key column="IDOBJECT" />
<one-to-many class="Child" />
</set>
查询:
SELECT o from Object o JOIN FETCH o.parent JOIN FETCH o.children
最后:
o.parent取
o.children 为空
子项在数据库中并与 returned 对象关联。
我用基于注释的方式测试了你的数据库结构,一切都fine.Test在你身边,检查你遗漏了什么:
Child:
@Entity
@Table(name = "child")
@XmlRootElement
public class Child implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@JoinColumn(name = "idobject", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY)
private entity.Object object;
public Child() {
}
public Child(Integer id) {
this.id = id;
}
//getter and setters
}
Object:
@Entity
@Table(name = "object")
@XmlRootElement
public class Object implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "object", fetch = FetchType.LAZY)
private List<Child> children;
@JoinColumn(name = "idparent", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY)
private Parent parent;
public Object() {
}
public Object(Integer id) {
this.id = id;
}
//getter and setter
}
Parent:
@Entity
@Table(name = "parent")
@XmlRootElement
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private List<entity.Object> objects;
public Parent() {
}
public Parent(Integer id) {
this.id = id;
}
//getter and setters
}
我的查询:
public class ObjectDao {
public static List<Object> getObjects() {
EntityManager em = Persistence.createEntityManagerFactory("test").createEntityManager();
try {
Query query = em.createQuery("SELECT o from Object o JOIN FETCH o.parent JOIN FETCH o.children");
List l = query.getResultList();
return l;
} catch (Exception ex) {
ex.printStackTrace();
return new ArrayList<Object>();
} finally {
em.close();
}
}
}
我用于调试的 servlet:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<entity.Object> objects = ObjectDao.getObjects();
for (entity.Object obj : objects) {
System.out.println("object name:" + obj.getName());
System.out.println("parent name:" + obj.getParent().getName());
List<Child> children = obj.getChildren();
System.out.println("children:");
for(Child c: children){
System.out.println(c.getName());
}
}
}
结果是:
object name:Object 1
parent name:Parent 1
children:
Child Name