打开JPA如何从外键关系中获取结果

时间:2012-04-16 13:42:45

标签: jpa-2.0 named-query

早上好。我一直在试图回答这个问题。

如果你有一个表有另一个表的外键,并且你想要两个表的结果,使用基本的sql你会在外键上做一个内连接,你会得到你请求的所有结果信息。当您在外键上生成JPA实体时,您会在外键列上获得@oneToone注释,@ oneToMany,@ ManyToMany,@ ManyToOne等。我有@oneToMany对外键和对应表列中主键的相应@ManyToOne我在正确的列上也有一个@joinedON注释...我还有一个基本的命名查询,它将从第一个选择所有内容表。我是否需要进行连接才能从基本sql中获取两个表中的信息?或者我有这些注释的事实会为我拉回那些记录吗?要清楚我是否有基于外键关系与表B相关的表A,并且我想要来自两个表的记录,我将基于外键将表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 个答案:

答案 0 :(得分:1)

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

当您从entityManager获取Person时,调用其联系人集合上的任何方法将懒惰地加载该人的联系人列表:

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()或任何查询),其联系人也将被加载。< / p>