早上好。我一直在到处寻找这个问题的答案。
如果您有一个具有指向另一个表的外键的表,并且您想要来自这两个表的结果,那么使用基本sql,您可以对外键执行内部连接,并且您将获得所请求的所有结果信息。当你在你的外键上生成你的JPA实体时,你会得到一个@oneToone注解,@oneToMany,@ManyToMany,@ManyToOne等等。我在外键上有@oneToMany,在相关表列的主键上有一个相应的@ManyToOne,在正确的列上也有一个@joinedON注释……我还有一个基本的命名查询,它将从第一个表中选择所有内容。我是否需要像在basic 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取回连接查询的所有数据?
发布于 2012-04-16 22:00:26
假设您有一个与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()或任何查询)时,其联系人也将被加载。
https://stackoverflow.com/questions/10175288
复制相似问题