休眠延迟获取 - 获取子对象



我的理解是,默认情况下,Hibernate会将所有关系类型的FetchType设置为lazy。

就我而言,我有一个双向的一对一-多对一关系,如下所示:

父类:

public class Parent{
@Id
@Column(name = "parent_id")
private long parentId;
@OneToMany(mappedBy = "parent")
@JsonIgnore
private List<Child> children;
public List<Child> getChildren()
{
return this.children;
}
}

儿童班:

public class Child
{
private String name;
@ManyToOne(optional = false) //every child must have a parent
@JoinColumn(name = "parent_id")
private Parent parent;
public Child(Parent parent, String name)
{
this.parent = parent;
this.name = name;
}
}

儿童服务:

public class ChildService
{
public List<Child> getChildren(long parentId)
{
Parent parent = getParentRepository().findOne(parentId);
return parent.getChildren(); //This returns null
}
public Child getNamedChild(long parentId)
{
Parent parent = getParentRepository().findOne(parentId);
//??????????????? 
//Not sure how to get the children of this specific parent, 
//which has a specific name.
}
}

父存储库:

public interface ParentRepository extends JpaRepository<Parent, Long> {
}

我这里有两个问题:

当我在 ChildService 中调用方法 getChildren(( 时,它返回 null。数据库确实包含正确的数据。 我需要用 LAZY 获取类型来获取这些。 在返回之前,我尝试调用"parent.getChildren((.size(("方法,但它仍然返回 null。

另一个问题是我如何得到一个有特定名字的孩子?可以通过存储库执行此操作吗?还是我需要获取孩子(parentId(,并迭代直到找到以特定方式命名的那个?

编辑: 在提出了一些建议之后,我继续以这种方式实现我的 ChildRepository:

public interface ChildRepository extends JpaRepository<Child, Long> {
@Query("SELECT child FROM Parent parent JOIN parent.child AS child WHERE parent.parentId = :parentId")
List<Child> getChildren(@Param("parentId") String parentId);
@Query("SELECT child FROM Parent parent JOIN arent.child AS child WHERE parent.parentId = :parentId AND child.childId = :childId")
Child getChildByName(@Param("childId") Long childId, @Param("parentId") String parentId);
}

你能在ChildService 类中注入 EntityManager 吗? 我无法完全验证下面的代码,但您可以尝试类似

public class ChildService
{
private EntityManager em;
public List<Child> getChildren(long parentId)
{
Query query = em.createQuery("SELECT c FROM Parent p JOIN FETCH p.children AS c WHERE p.parentId = :parentId");
query.setParameter("parentId", parentId);
return (List<Child>) q.getResultList();
}
public Child getNamedChild(long parentId, String name)
{
Query query = em.createQuery("SELECT c FROM Parent p JOIN FETCH p.children AS c WHERE p.parentId = :parentId AND c.name = :name");
query.setParameter("parentId", parentId);
query.setParameter("name", name);
return (Child) q.getSingleResult();
}
}

最新更新