2012-04-16 27 views
0

早上好。我一直在试图回答这个问题。打开JPA如何取回来自外键关系的结果

如果你有一个表有外键到另一个表,并且你想要两个表的结果,使用基本的SQL你会对外键进行内部连接,你会得到你请求的所有结果信息。当您在外键上生成JPA实体时,您会在外键列上获得@oneToone注释,@oneToMany,@ManyToMany,@ManyToOne等。我有@oneToMany通过外键和对应的表列中的主键相应的@ManyToOne我也有一个@joinedON注释在正确的列...我也有一个基本的命名查询,将选择从第一表。我需要做一个连接来从两个表中获取信息,就像我需要在基本的SQL中做的那样?或者我有这些注释的事实将这些记录拉回给我?需要明确的是,如果我有这是关系到基于外键关系表B表A中,我想b根据外键或

Select * From A inner Join B on A.column2 = B.column1 

或者其他两个表我会联结表中的记录一些这样的无意义(请原谅我的SQL,如果它不完全正确,但你有想法)... 该查询将选择所有列A和B,其中这两个选定的列... 这是我的命名查询,我使用....

@NamedQuery(name="getQuickLaunch", query = "SELECT q FROM QuickLaunch q") 

这是我如何打电话,在我的无状态会话bean ...

try 
    { 
     System.out.println("testing 1..2..3"); 
     listQL = emf.createNamedQuery("getQuickLaunch").getResultList(); 
     System.out.println("What is the size of this list: number "+listQL.size()); 
     qLaunchArr = listQL.toArray(new QuickLaunch[listQL.size()]);    

    } 

现在这个调用返回表A的所有列,但它缺少表B的列。我的第一本能是改变查询来加入这两个表......但那种让我想想使用JPA有什么意义,然后如果我只是写一些相同的查询,那我就会写在不同的地方。另外,我不想忽略简单的事情。那么你说堆栈溢出爱好者呢?如何使用JPA取回所有连接查询的数据?

回答

1

假设您有一个具有与联系人实体的OneToMany关联的Person实体。

当你从EntityManager的一个人,要求其收集接触的任何方法都会懒洋洋地加载该人的联系人列表:

person.getContacts().size(); 
// triggers a query select * from contact c where c.personId = ? 

如果你想使用一个单一的查询加载人及其所有联系人,您在SQL查询需要一个fetch

select p from Person p 
left join fetch p.contacts 
where ... 

您还可以标记该协会本身也渴望加载,使用@OneToMany(lazy = false),但随后一个人每次被加载时(VIE em.find()或任何q uery),其联系人也将被加载。

+0

这是否会在指定的查询中获取? – SoftwareSavant 2012-04-16 14:30:09

+0

查询是否被命名并不会改变任何内容。 JPQL是JPQL。如果您希望命名查询执行提取,请将联合提取添加到指定查询中。 – 2012-04-16 14:40:47

+0

我是否需要在那里?我需要指定所需的ID连接列吗?到目前为止,我所看到的所有例子都有点含糊 – SoftwareSavant 2012-04-16 15:14:45