首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打开JPA如何从外键关系中获取结果

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

Stack Overflow用户
提问于 2012-04-16 21:42:45
回答 1查看 2.2K关注 0票数 0

早上好。我一直在到处寻找这个问题的答案。

如果您有一个具有指向另一个表的外键的表,并且您想要来自这两个表的结果,那么使用基本sql,您可以对外键执行内部连接,并且您将获得所请求的所有结果信息。当你在你的外键上生成你的JPA实体时,你会得到一个@oneToone注解,@oneToMany,@ManyToMany,@ManyToOne等等。我在外键上有@oneToMany,在相关表列的主键上有一个相应的@ManyToOne,在正确的列上也有一个@joinedON注释……我还有一个基本的命名查询,它将从第一个表中选择所有内容。我是否需要像在basic sql中那样进行连接以从两个表中获取信息?或者,我拥有这些注释的事实会为我拉回这些记录吗?为了清楚起见,如果我有基于外键关系与表B相关的表A,并且我想要两个表中的记录,我会基于外键将表A连接到表B,或者

代码语言:javascript
运行
复制
Select * From A inner Join B on A.column2 = B.column1

或者其他一些-这样的胡言乱语(如果我的sql不完全正确,请原谅,但你明白我的想法)……该查询将从A和B中选择所有列,其中这两个选定的列...下面是我正在使用的命名查询...

代码语言:javascript
运行
复制
@NamedQuery(name="getQuickLaunch", query = "SELECT q FROM QuickLaunch q")

这就是我在我的无状态会话bean中调用它的方式...

代码语言:javascript
运行
复制
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取回连接查询的所有数据?

EN

Stack Overflow用户

回答已采纳

发布于 2012-04-16 22:00:26

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

当您从entityManager获取一个Person时,在其联系人集合上调用任何方法都会延迟加载此人的联系人列表:

代码语言:javascript
运行
复制
person.getContacts().size();
// triggers a query select * from contact c where c.personId = ?

如果您想使用一个查询来加载一个人及其所有联系人,那么在SQL查询中需要一个fetch

代码语言:javascript
运行
复制
select p from Person p 
left join fetch p.contacts
where ...

您也可以使用@OneToMany(lazy = false)将关联本身标记为立即加载,但是每次加载人员(vie em.find()或任何查询)时,其联系人也将被加载。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10175288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档