Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何通过外键表获取关联对象列表_Hibernate_Jpa_Jpql - Fatal编程技术网

Hibernate 如何通过外键表获取关联对象列表

Hibernate 如何通过外键表获取关联对象列表,hibernate,jpa,jpql,Hibernate,Jpa,Jpql,我有节点,它们有子节点列表。按照JPA惯例,我最后得出以下表格: t_节点具有属性id、name、和department t\u node\u t\u node具有属性t\u node\u id和childNodes\u id 我想返回父节点的子节点列表。如何编写entitymanager查询来执行此操作 我得到的最接近的结果是: List<Node> childNodes = (List<Node>) entityManager.createQuery("select

我有
节点
,它们有
子节点列表
。按照JPA惯例,我最后得出以下表格:

t_节点
具有属性
id
name
、和
department

t\u node\u t\u node
具有属性
t\u node\u id
childNodes\u id

我想返回父节点的子节点列表。如何编写
entitymanager
查询来执行此操作

我得到的最接近的结果是:

List<Node> childNodes = (List<Node>) entityManager.createQuery("select n from Node n JOIN n.t_node_t_node t where n.id = " + parent_id).getResultList();
List childNodes=(List)entityManager.createQuery(“从节点n中选择n加入n.t_节点_节点t,其中n.id=“+parent_id”).getResultList();

返回异常:
无法解析属性t_节点t_节点

数据库列
t_节点t_节点
不能在JPQL查询中使用。JPQL查询操作实体及其持久属性,而不是数据库表和列

您的实体可能大致如下所示:

@Entity
public class Node {
    @Id private Long id;

    @ManyToOne
    Node parent;

    @OneToMany(mappedBy = "parent")
    private List<Node> nodes;
...
}
Long parentId = 1L;
Query q = em.createQuery("SELECT n FROM Node n WHERE n.parent.id =  :parentId");
q.setParameter("parentId", parentId);
List<Node> childNodes = q.getResultList();
@实体
公共类节点{
@Id私人长Id;
@许多酮
节点父节点;
@OneToMany(mappedBy=“家长”)
私有列表节点;
...
}
当父节点id给定时,子节点可以进行如下查询:

@Entity
public class Node {
    @Id private Long id;

    @ManyToOne
    Node parent;

    @OneToMany(mappedBy = "parent")
    private List<Node> nodes;
...
}
Long parentId = 1L;
Query q = em.createQuery("SELECT n FROM Node n WHERE n.parent.id =  :parentId");
q.setParameter("parentId", parentId);
List<Node> childNodes = q.getResultList();
Long parentId=1L;
Query q=em.createQuery(“从节点n中选择n,其中n.parent.id=:parentId”);
q、 setParameter(“parentId”,parentId);
List childNodes=q.getResultList();

我用
@manytone节点父节点更新了我的节点对象
并添加了
(mappedBy=“parent”)
。现在创建数据库时,不会创建我的
t\u节点\u t\u节点
表。我已经实现了所有其他功能,并且得到了
childNodes
列表的空指针。我现在看不出他们之间有什么联系。我假设孩子只能有一个父母。在这种情况下,将出现一对多/多对一,然后将其作为附加列具体化到数据库表中。若一个子系统可以有多个父系统,那个么可以使用@ManyToMany(这样就会有联接表)。