早上好。我一直在试图回答这个问题。
如果你有一个表有另一个表的外键,并且你想要两个表的结果,使用基本的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获取所有已加入查询的数据?
答案 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>