0

早上好。我一直在寻找试图回答这个问题的方法。

如果您的表具有指向另一个表的外键,并且您想要两个表的结果,则使用基本 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 取回连接查询的所有数据?

4

1 回答 1

1

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

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

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

如果要使用单个查询来加载人员及其所有联系人,则需要fetch在 SQL 查询中使用:

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

您还可以使用 将关联本身标记为预加载,@OneToMany(lazy = false)但是每次加载一个人(vieem.find()或任何查询)时,它的联系人也将被加载。

于 2012-04-16T14:00:26.497 回答